Ответ 1
Вы можете использовать просмотрщик байт-кода Kotlin, чтобы узнать, с чем скомпилированы эти параметры.
С Kotlin 1.0.2 скомпилированный байт-код показывает, что
-
val
свойство вobject
илиcompanion object
скомпилировано в полеprivate static final
внутри класса:// access flags 0x1A private final static I FILES_TO_DOWNLOAD = 100
и getter, который вызывается при обращении к свойству:
// access flags 0x1019 public final static synthetic access$getFILES_TO_DOWNLOAD$cp()I
Из Java геттер может быть вызван как
DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD()
илиDefaultValues.Companion.getFILES_TO_DOWNLOAD()
соответственно. -
Свойство верхнего уровня non-
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
, либо на верхнем уровне.