Static data in Kotlin

前端 未结 1 1624
挽巷
挽巷 2021-01-03 19:31

Please tell me, is there any difference (in terms of Java) in this examples:

  1. object DefaultValues {
        val FILES_TO_DOWNLOAD =          
    
    
            
相关标签:
1条回答
  • 2021-01-03 19:45

    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

    1. 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.

    2. 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.

    0 讨论(0)
提交回复
热议问题