2015-10-13 22 views
9

Recentemente ho esaminato il lang di Kotlin e il suo interop con java. Ho seguente codice Java:Uso delle costanti kotlin nell'espressione java switch

public void select(int code) { 
    switch code { 
     case Service.CONSTANT_ONE: 
      break; 
     case Service.CONSTANT_TWO: 
      break; 
     default: 
      break; 
    } 
} 

Dove Service.kt scritto come segue:

class Service { 
    companion object { 
     val CONSTANT_ONE = 1 
     val CONSTANT_TWO = 2 
    } 
} 

Java compilatore dice che CONSTANT_ONE e CONSTANT_TWO devono essere costanti, ma non so, come posso fare più costante di quello che sono adesso. Quindi la mia domanda è: come usare le costanti da kotlin nell'istruzione java swicth?

Sto usando jdk8 e kotlin M14.

+0

Non so kotlin. Ma in Java una costante del caso switch deve essere nota al momento della compilazione. Quindi un campo finale/costante assegnato durante la compilazione non può essere utilizzato in un'istruzione switch. –

+0

@Pinkie si, se ho dichiarato 'CONSTANT_ONE' come' static final' da qualche parte nel codice java, potrei usarlo in switch statement. Comunque non so come potrei scriverlo in modo più rigoroso a Kotlin di quanto lo sia ora. – Mikhail

+1

M14 cambia stato "Poiché M14 è necessario prefiggere le costanti di Kotlin con const per poterle usare nelle annotazioni e vedere come campi da Java" –

risposta

19

M14 cambia stato "Dal M14 abbiamo bisogno di prefisso costanti Kotlin con const per essere in grado di utilizzarli in annotazioni e vedere come campi da Java"

class Service { 
    companion object { 
     const val CONSTANT_ONE = 1 
     const val CONSTANT_TWO = 2 
    } 
} 

IntelliJ mi mostra ancora un errore nel caso di Java ma compila e funziona.

+0

mostra un errore e non compila .... do ... –

+0

Continua a vedere l'errore (richiesta di un'espressione costante) in IntelliJ IDEA 2016.1.3/Kotlin 1.0.2-release-IJ145-10, ma è compilato e funziona per me (strano!) –

+0

Sembra che una correzione sia in arrivo in Kotlin 1.0.3: https://youtrack.jetbrains.com/issue/KT-12026 –

0

Una soluzione ancora più semplice potrebbe essere: di dichiarare le costanti nel 'file di Kotlin' invece di 'classe Kotlin', che è fondamentalmente dichiara le costanti di fuori della portata di classe e possono fare riferimento ovunque con una corretta importazioni.

const val CONSTANT_ONE = 1 
const val CONSTANT_TWO = 2 

class Service { 
} 

Oppure, se volete qualcosa che è simile a private static final int CONSTANT_ONE = 1;

è possibile dichiarare le costanti di essere privata nel file di Kotlin, e solo le classi all'interno dello stesso file di avere accessi ad esso.

private const val CONSTANT_ONE = 1 
class A{ 
    // can access CONSTANT_ONE 
} 

class B{ 
    // can access CONSTANT_ONE 
} 
Problemi correlati