Please tell me, is there any difference (in terms of Java) in this examples:
object DefaultValues {
val FILES_TO_DOWNLOAD = 100
}
and
class DefaultValues {
companion object {
val FILES_TO_DOWNLOAD = 100
}
}
Without class or object wrapper:
const val DEFAULT_FILES_TO_DOWNLOAD = 100
and
val DEFAULT_FILES_TO_DOWNLOAD = 100
What is the true way to define?:
public static final int FILES_TO_DOWNLOAD = 100
You can use Kotlin bytecode viewer to find out what these options are compiled to.
With Kotlin 1.0.2 the compiled bytecode shows that
val
property in object
or companion object
is compiled into a private static final
field inside the class:
// access flags 0x1A
private final static I FILES_TO_DOWNLOAD = 100
and a getter, which is called when referring to the property:
// access flags 0x1019
public final static synthetic access$getFILES_TO_DOWNLOAD$cp()I
From Java, the getter can be called as DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD()
or DefaultValues.Companion.getFILES_TO_DOWNLOAD()
respectively.
Non-const
top level property is compiled to the same to (1) with only difference that the field and getter are placed inside FilenameKt
class now.
But top level const val
is compiled into a public static final
field:
// access flags 0x19
public final static I DEFAULT_FILES_TO_DOWNLOAD = 100
The same public static final field will be produced when a const val
is declared inside an object. Also, you can achieve the same resulting bytecode if you add @JvmField
annotation to the properties declared in (1).
Concluding that, you can define public static final
field using const
or @JvmField
either in an object
or at top level.