2015-07-18 23 views
11

Secondo documentation un creato una classe enumCome dichiarare una variabile di tipo enum in Kotlin?

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

Poi sto cercando di dichiarare una variabile in qualche funzione

val bitCount : BitCount = BitCount(32) 

ma c'è un errore di compilazione

Come dichiaro una variabile di tipo BitCount e inizializzarla da Int?

Error:(18, 29) Kotlin: Enum types cannot be instantiated

+0

BTW, non è necessario utilizzare la sintassi completa del costruttore per casi semplici, quindi la parola 'costruttore 'è ridondante. Può essere fatto solo con 'public enum class BitCount (..)' – voddan

+0

Se vuoi ancora creare un'istanza dell'Enum dato il valore numerico, puoi (ma è più "trova l'istanza data un valore numerico") : http://stackoverflow.com/a/34625163/3679676 –

+0

per i nuovi arrivati. leggi questo tutorial sull'enumerazione di Kotlin. http://developine.com/enum-classes-in-kotlin-example/ –

risposta

8

Le istanze Enum possono essere dichiarate solo all'interno della dichiarazione di classe enum.

Se si desidera creare nuova BitCount basta aggiungerlo come illustrato di seguito:

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

e utilizzare ovunque come BitCount.x16.

+0

"enum class BitCount (val value: Int)" è sufficiente, perché non puoi creare un'istanza al di fuori dell'enum – D3xter

+0

Vedo, ho pensato che enum il costruttore di classi consente la creazione di un'istanza di enum passando il corrispondente valore ad essa. –

+2

Ecco a cosa servono le classi. –

20

Come indicato in altre risposte, è possibile fare riferimento a qualsiasi valore dello enum esistente per nome, ma non costruirne uno nuovo. Ciò non impedisce di fare qualcosa di simile a quello che stavi cercando ...

// 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) 

Se mancavano per trovare l'istanza del enum sulla base del valore numerico 32 allora si potrebbe eseguire la scansione dei valori in il seguente modo. Creare il enum con un companion object e una funzione 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 } 
    } 
} 

quindi chiamare la funzione per ottenere una corrispondenza istanza esistente:

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

bella e abbastanza. In alternativa, in questo caso è possibile creare il nome del valore enum dal numero poiché si ha una relazione prevedibile tra i due, quindi utilizzare BitCount.valueOf(). Ecco la nuova funzione from() all'interno dell'oggetto associato.

fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue") 
+0

Bello!Si potrebbe voler usare 'valueOf', però; sembra che sovraccaricheremo 'valueOf (String)'. – Raphael

+2

Varianti: 1) 'when' sui possibili input, che trattano' else' correttamente. 2) Usa 'firstOrNull' e rendi il valore di ritorno di' from' opzionale. 3) [Preprocesso di una mappa] (http://stackoverflow.com/a/37795810/539599). – Raphael

+0

per i nuovi arrivati. leggi questo tutorial sull'enumerazione di Kotlin. http://developine.com/enum-classes-in-kotlin-example/ –

Problemi correlati