web-dev-qa-db-ja.com

関連付けられた型を使用する場合の封印されたクラスと列挙型

Intに基づいてカラーオブジェクトを作成します。 sealed classenumを使用して同じ結果を得ることができ、どちらが優れているか疑問に思っていました。

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の方法はありますか?

17
Benjamin

sealedクラスは"enumクラスの拡張"と呼ばれます。状態を含む複数のインスタンスに存在できます。値を複数回インスタンス化する必要がなく、特別な動作を提供しないため、enumsはユースケースに適しているだけで、ここで理解しやすくなります。

あなたの例では単にsealedは必要ありません。

19
s1m0nw1