web-dev-qa-db-fra.com

classe scellée vs énumération lors de l'utilisation d'un type associé

Je voudrais créer un objet couleur basé sur un Int. Je peux obtenir le même résultat en utilisant sealed class et enum et je me demandais si l'un est meilleur que l'autre.

En utilisant 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}")
            }

Utilisation de 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}")
        }

Sont-ils équivalents en termes de performances? Existe-t-il un meilleur moyen kotlin pour obtenir le même résultat?

17
Benjamin

sealed les classes seraient "une extension des classes enum". Ils peuvent exister dans plusieurs instances contenant l'état. Comme vous n'avez pas besoin que les valeurs soient instanciées plusieurs fois et qu'elles ne fournissent pas de comportement spécial, enums devrait être juste pour le cas d'utilisation et plus facile à comprendre ici.

Il n'y a tout simplement pas besoin de sealed dans votre exemple.

19
s1m0nw1