2016-05-27 34 views
21

Ti prego, dimmi, c'è qualche differenza (in termini di Java) in questi esempi:dati statici in Kotlin

  1. object DefaultValues { 
        val FILES_TO_DOWNLOAD = 100 
    } 
    

    e

    class DefaultValues { 
        companion object { 
         val FILES_TO_DOWNLOAD = 100 
        } 
    } 
    
  2. Senza wrapper di classe o oggetto:

    const val DEFAULT_FILES_TO_DOWNLOAD = 100 
    

    e

    val DEFAULT_FILES_TO_DOWNLOAD = 100 
    

Qual è il vero modo per definire ?:

public static final int FILES_TO_DOWNLOAD = 100 

risposta

19

È possibile utilizzare Kotlin bytecode viewer per scoprire che cosa queste opzioni sono compilati a.

Con Kotlin 1.0.2 il bytecode compilato mostra che

  1. val struttura in object o companion object viene compilata in un campo private static final all'interno della classe:

    // access flags 0x1A 
    private final static I FILES_TO_DOWNLOAD = 100 
    

    e un getter, che è chiamato quando si fa riferimento alla proprietà:

    // access flags 0x1019 
    public final static synthetic access$getFILES_TO_DOWNLOAD$cp()I 
    

    Da Java, il getter può essere chiamato come DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD() o DefaultValues.Companion.getFILES_TO_DOWNLOAD() rispettivamente.

  2. Non- const struttura di livello superiore è compilato al medesimo per (1) con la sola differenza che il campo e getter sono collocati all'interno FilenameKt classe ora.

    Ma alto livello const val viene compilata in un campo public static final:

    // access flags 0x19 
    public final static I DEFAULT_FILES_TO_DOWNLOAD = 100 
    

    Lo stesso campo finale statico pubblico sarà prodotto quando un const val viene dichiarato all'interno di un oggetto. Inoltre, è possibile ottenere lo stesso codice byte risultante se si aggiunge l'annotazione @JvmField alle proprietà dichiarate in (1).


concludendo che, è possibile definire public static final campo utilizzando const o @JvmField sia in un object oa livello superiore.

+0

per quanto riguarda la variabile interna x ;? è statico? – UmAnusorn

+0

@umitems, 'internal' è solo un modificatore di visibilità, non dovrebbe fare molta differenza nel bytecode con un normale' var' pubblico. – hotkey

+0

Grazie per la risposta, vedo. Ho appena provato a convertire public static int x in file java in file Kotlin, poi ho ottenuto invece x var interna. – UmAnusorn