2015-10-13 9 views
9

Ich habe vor kurzem in Kotlin Sprache und seine Interop mit Java untersucht. Ich habe folgende Java-Code:Mit Kotlin-Konstanten in Java Switch-Ausdruck

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

Wo Service.kt wie folgt geschrieben:

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

Java-Compiler sagt, dass CONSTANT_ONE und CONSTANT_TWO Konstanten sein müssen, aber ich weiß nicht, wie ich sie machen mehr konstant als sie jetzt sind. Also meine Frage ist: wie Konstanten von Kotlin in Java Swicth Aussage zu verwenden?

Ich benutze jdk8 und kotlin M14.

+0

Ich weiß nicht über Kotlin. Aber in Java muss zum Zeitpunkt der Kompilierung eine Konstante für den Schalterfall bekannt sein. Ein endgültiges/konstantes Feld, das während der Kompilierungszeit zugewiesen wird, kann daher in einer switch-Anweisung nicht verwendet werden. –

+0

@Pinkie Ja, wenn ich 'CONSTANT_ONE' irgendwo im Java-Code als' static final' deklariert habe, könnte ich es in der switch-Anweisung verwenden. Aber ich weiß nicht, wie ich es in Kotlin strikter schreiben könnte als jetzt. – Mikhail

+1

M14 ändert den Status "Seit M14 müssen wir die Kotlin-Konstanten mit const voranstellen, um sie in Annotationen verwenden zu können und als Felder von Java zu sehen" –

Antwort

19

M14 den Zustand ändert „Da M14 brauchen wir Kotlin Konstanten mit const zu können, nutzen sie in Anmerkungen und sehen Sie, wie Felder aus Java Präfix“

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

IntelliJ noch zeigt mir einen Fehler in der Java-Fall aber es kompiliert und arbeitet.

+0

zeigt einen Fehler an und kompiliert nicht .... doh ... –

+0

Immer noch der Fehler (Konstanter Ausdruck erforderlich) in IntelliJ IDEA 2016.1.3/Kotlin 1.0.2-release-IJ145-10, aber es kompiliert und funktioniert für mich (ungerade!) –

+0

Sieht aus wie ein Update in Kotlin 1.0.3 kommt: https://youtrack.jetbrains.com/issue/KT-12026 –

0

Eine noch einfachere Lösung wäre: die Konstanten in der ‚Kotlin Datei‘ anstelle von ‚Kotlin Klasse‘ zu erklären, die im Grunde die Konstanten außerhalb des Klassenbereich bekannt, dass folgende und können sie überall mit der richtigen referenziert werden Importe.

const val CONSTANT_ONE = 1 
const val CONSTANT_TWO = 2 

class Service { 
} 

Oder wenn Sie wollen etwas, das

-private static final int CONSTANT_ONE = 1; ähnlich ist Sie die Konstanten deklarieren können in Kotlin-Datei, und nur Klassen in derselben Datei privat sein Zugriffe zu.

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

class B{ 
    // can access CONSTANT_ONE 
}