2016-05-27 12 views
21

Bitte sagen Sie mir, gibt es einen Unterschied (in Bezug auf Java) in diesen Beispielen:Statische Daten in Kotlin

  1. object DefaultValues { 
        val FILES_TO_DOWNLOAD = 100 
    } 
    

    und

    class DefaultValues { 
        companion object { 
         val FILES_TO_DOWNLOAD = 100 
        } 
    } 
    
  2. Ohne Klassen- oder Objektwrapper:

    const val DEFAULT_FILES_TO_DOWNLOAD = 100 
    

    und

    val DEFAULT_FILES_TO_DOWNLOAD = 100 
    

Was der wahre Weg ist ?: zu definieren

public static final int FILES_TO_DOWNLOAD = 100 

Antwort

19

Sie Kotlin bytecode viewer verwenden können, um herauszufinden, was diese Optionen zusammengestellt.

Mit Kotlin 1.0.2 der kompilierte Bytecode zeigt, dass

  1. val Eigenschaft in object oder companion object in ein private static final Feld innerhalb der Klasse kompiliert wird:

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

    und ein Getter, was genannt, wenn auf die Eigenschaft bezogen wird:

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

    Aus Java kann der Getter als DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD() oder DefaultValues.Companion.getFILES_TO_DOWNLOAD() bezeichnet werden.

  2. Non- const Top-Level-Eigenschaft auf den gleichen erstellenden (1) mit einzigen Unterschied, dass das Feld und Getter innerhalb FilenameKt Klasse nun platziert.

    Aber Top-Level-const val in ein public static final Feld zusammengestellt:

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

    Die gleiche öffentliche statische wird letzte Feld erzeugt werden, wenn ein const val innerhalb eines Objekts deklariert wird. Sie können denselben resultierenden Bytecode auch erreichen, wenn Sie den Eigenschaften @JvmField annotieren, die unter (1) deklariert sind.


Schlussfolgerung gelangt, dass Sie public static final Feld const oder @JvmField entweder in einem object oder auf höchster Ebene unter Verwendung definieren.

+0

Wie wäre es mit internen var x;? Ist es var statisch? – UmAnusorn

+0

@umitems, 'internal' ist nur ein Sichtbarkeitsmodifizierer, sollte keinen großen Unterschied im Bytecode mit einer normalen öffentlichen' var' machen. – hotkey

+0

Vielen Dank für Ihre Antwort, ich verstehe. Ich habe gerade versucht, öffentliche statische Int x in Java-Datei in Kotlin-Datei zu konvertieren, dann habe ich stattdessen interne var x. – UmAnusorn