2016-05-12 42 views
7

solito ho questo in Java:const statica in Kotlin da Java nome della classe

package some.package; 
public class Clz { 
    public static final String ACTION_DIVE = Clz.class.getName() + ".action.DIVE"; 
} 

che è accessibile dall'esterno quella classe come Clz.ACTION_DIVE e il valore sarà "some.package.Clz.action.DIVE".

Come posso fare lo stesso nella classe Kotlin Clz in modo che sia possibile accedervi allo stesso modo da classi Java esterne? Ho provato quanto segue, ma non viene compilato perché non è una costante:

package some.package 
object Clz { 
    const val ACTION_DIVE = Clz.javaClass.name + ".action.DIVE" 
} 

risposta

7

Clz::class.java.name

Vedi Class references nella documentazione ufficiale Kotlin.

+1

non funziona. 'const val ACTION_DIVE = Clz :: class.java.name +" .action.DIVE "' L'errore è: 'Const val initializer dovrebbe essere un valore costante' – yuku

+2

Usa' @ JvmField' invece di 'const' (' const' è solo per le costanti in fase di compilazione): https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#static-fields –

+0

Immagino sia così. @JvmField. Grazie! – yuku

3

È possibile utilizzare:

object Clz { 
    val ACTION_DIVE = Clz::class.java.name + ".action.DIVE" 
} 

Si noti che dal momento che sta chiamando java proprietà extension il ACTION_DIVE potrebbero non essere const.

Se davvero bisogno di un const si può faresi poteva, nelle versioni precedenti di Kotlin compilatore, fare:

object Clz { 
    const val ACTION_DIVE = "" + Clz::class + ".action.DIVE" 
} 
+0

Non sembra funzionare con const: 'const val ACTION_DIVE =" "+ Clz :: class +" .action.DIVE "' –

+0

@StephaneL Immagino che funzionasse con una versione precedente del compilatore Kotlin. Probabilmente era un bug. – miensol

2

è possibile dichiarare una companion object dentro la classe e mettere la proprietà costante all'interno .

class Clz { 

    companion object{ 
     var ACTION_DIVE = Clz::class.simpleName + ".action.DIVE" 
    } 
} 

Quindi è possibile accedere alla proprietà

println(Clz.ACTION_DIVE) 
+0

Una variabile globale mutabile raramente è una buona idea. Né era l'intenzione dell'autore. – miensol

0

Un modo elegante per concatenare le stringhe:

package some.package 

object Clz { 
    val ACTION_DIVE = "${Clz::class.java.name}.action.DIVE" 
} 
+1

Questo non verrà compilato: "L'inizializzatore di Const 'val' dovrebbe essere un valore costante" – miensol

+0

@miensol hai ragione, ho appena rimosso il modificatore 'const'. – epool

0

lavoro per me:

class FetchWeatherTask : AsyncTask<Void,Void,String>() { 
    companion object { 
     @JvmField val TAG: String = FetchWeatherTask().javaClass.simpleName 
    } 
}