Статические данные в Котлине

Скажите, пожалуйста, есть ли разница (с точки зрения Java) в этих примерах:

object DefaultValues {
    val FILES_TO_DOWNLOAD = 100
}

а также

class DefaultValues {
    companion object {
        val FILES_TO_DOWNLOAD = 100
    }
}

Без обертки класса или объекта:

const val DEFAULT_FILES_TO_DOWNLOAD = 100

а также

val DEFAULT_FILES_TO_DOWNLOAD = 100

Как правильно определить ?:

public static final int FILES_TO_DOWNLOAD = 100

Ответы на вопрос(1)

Решение Вопроса

Kotlin просмотра байт-кода чтобы выяснить, к чему эти опции компилируются.

С Kotlin 1.0.2 скомпилированный байт-код показывает, что

val недвижимость вobject или жеcompanion object составлен вprivate static final поле внутри класса:

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

и геттер, который вызывается при обращении к свойству:

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

Из Java геттер можно назватьDefaultValues.INSTANCE.getFILES_TO_DOWNLOAD() или жеDefaultValues.Companion.getFILES_TO_DOWNLOAD() соответственно.

не-const свойство верхнего уровня компилируется к тому же(1) с той лишь разницей, что поле и геттер находятся внутриFilenameKt класс сейчас.

Но на высшем уровнеconst val составлен вpublic static final поле:

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

Такое же общедоступное статическое конечное поле будет создано, когдаconst val объявлен внутри объекта. Кроме того, вы можете получить тот же результирующий байт-код, если вы добавите@JvmField аннотация к свойствам, заявленным в(1).

Делая вывод, вы можете определитьpublic static final поле с использованиемconst или же@JvmField либо вobject или на верхнем уровне.

 hotkey13 дек. 2016 г., 11:57
@umitems,internal является только модификатором видимости, не должно иметь большого значения в байт-коде с обычным publicvar.
 UmAnusorn13 дек. 2016 г., 10:57
как насчет внутреннего var x ;? это делает вар статической?
 UmAnusorn13 дек. 2016 г., 12:04
Спасибо за ваш ответ, я вижу. Я просто попытался преобразовать public static int x в java-файле в файл Kotlin, затем вместо этого я получил внутреннюю переменную x.
 hotkey07 февр. 2017 г., 21:42
@LouisCAD,const val а также@JvmField более эффективны, чем простыеval, но это в основном из-за вызовов геттеров, в то время как JVM достаточно хорош для встраивания функций и особенно для геттеров во время выполнения. Я думаю, что в долгосрочной перспективе разница в производительности должна быть незначительной (для некритической части кода). Что касается размера байт-кода, вторая опция также производит байт-код меньшего размера, но вряд ли вы сильно сэкономите, оптимизируя это.
 Louis CAD07 февр. 2017 г., 21:10
Означает ли это какую-либо разницу с точки зрения производительности и размера байт-кода?

Ваш ответ на вопрос