web-dev-qa-db-fra.com

Comment déclarer une variable de type enum dans Kotlin?

Selon documentation a créé une classe enum

enum class BitCount public constructor(val value : Int)
{
  x32(32),
  x64(64)
}

Ensuite, j'essaie de déclarer une variable dans une fonction

val bitCount : BitCount = BitCount(32)

mais il y a une erreur de compilation

Comment déclarer une variable de type BitCount et l'initialiser à partir de Int?

Erreur: (18, 29) Kotlin: les types enum ne peuvent pas être instanciés

18
Ed.ward

Comme indiqué dans d'autres réponses, vous pouvez référencer toute valeur de la variable enum qui existe par son nom, mais pas en créer une nouvelle. Cela ne vous empêche pas de faire quelque chose de similaire à ce que vous essayiez ...

// wrong, it is a sealed hierarchy, you cannot create random instances
val bitCount : BitCount = BitCount(32)

// correct (assuming you add the code below)
val bitCount = BitCount.from(32)

Si vous souhaitez rechercher l'instance de enum en fonction de la valeur numérique 32, vous pouvez analyser les valeurs de la manière suivante. Créez la enum avec un companion object et une fonction from():

enum class BitCount(val value : Int)
{
    x16(16),
    x32(32),
    x64(64);

    companion object {
        fun from(findValue: Int): BitCount = BitCount.values().first { it.value == findValue }
    }
}

Appelez ensuite la fonction pour obtenir une instance existante correspondante:

val bits = BitCount.from(32) // results in BitCount.x32

Gentil et jolie. Sinon, dans ce cas, vous pouvez créer le nom de la valeur enum à partir du nombre car vous avez une relation prévisible entre les deux, puis utiliser BitCount.valueOf(). Voici la nouvelle fonction from() dans l'objet compagnon.

fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue")
40
Jayson Minard

Les instances enum ne peuvent être déclarées que dans la déclaration de classe enum.

Si vous voulez créer un nouveau BitCount, ajoutez-le comme indiqué ci-dessous:

enum class BitCount public constructor(val value : Int)
{
    x16(16),
    x32(32),
    x64(64)
}

et utiliser partout comme BitCount.x16.

12
user2235698

Qu'en est-il de:

enum class BitCount constructor(val value : Int)
{
    x32(32),
    x64(64);

    companion object {
         operator fun invoke(rawValue: Int) = BitCount.values().find { it.rawValue == rawValue }
    }
}

Ensuite, vous pouvez l'utiliser comme vous l'avez proposé:

val bitCount = BitCount(32)

Et il retournera null si la valeur n'est pas trouvée dans les cas enum

0
Angel G. Olloqui