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
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")
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
.
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