Int
に基づいてカラーオブジェクトを作成します。 sealed class
とenum
を使用して同じ結果を得ることができ、どちらが優れているか疑問に思っていました。
sealed class
の使用:
sealed class SealedColor(val value: Int) {
class Red : SealedColor(0)
class Green : SealedColor(1)
class Blue : SealedColor(2)
companion object {
val map = hashMapOf(
0 to Red(),
1 to Green(),
2 to Blue()
)
}
}
val sealedColor: SealedColor = SealedColor.map[0]!!
when (sealedColor) {
is SealedColor.Red -> print("Red value ${sealedColor.value}")
is SealedColor.Green -> print("Green value ${sealedColor.value}")
is SealedColor.Blue -> print("Blue value ${sealedColor.value}")
}
enum
の使用:
enum class EnumColor(val value: Int) {
Red(0),
Green(1),
Blue(2);
companion object {
fun valueOf(value: Int): EnumColor {
return EnumColor
.values()
.firstOrNull { it.value == value }
?: throw NotFoundException("Could not find EnumColor with value: $value")
}
}
}
val enumColor: EnumColor = EnumColor.valueOf(0)
when (enumColor) {
EnumColor.Red -> print("Red value ${enumColor.value}")
EnumColor.Green -> print("Green value ${enumColor.value}")
EnumColor.Blue -> print("Blue value ${enumColor.value}")
}
パフォーマンスの点で同等ですか?同じ結果を達成するためのより良いkotlinの方法はありますか?
sealed
クラスは"enumクラスの拡張"と呼ばれます。状態を含む複数のインスタンスに存在できます。値を複数回インスタンス化する必要がなく、特別な動作を提供しないため、enumsはユースケースに適しているだけで、ここで理解しやすくなります。
あなたの例では単にsealed
は必要ありません。