Kotlin:为什么编译器需要`const`修饰符?

时间:2017-08-11 06:58:33

标签: kotlin

在Kotlin有:

  • val - readonly property
  • const val - 编译时常量

来自documentation

  

编译时间常数

     

编译时已知的值的属性可以使用const修饰符标记为编译时常量。这些属性需要满足以下要求:

     
      
  • 对象的顶级或成员
  •   
  • 使用String类型或基本类型
  • 初始化   
  • 没有自定义getter
  •   

鉴于kotlin编译器确实知道识别初始值(例如不需要在初始化器中定义变量类型):

  • 为什么编译器需要程序员的帮助?
  • 无法识别"属性,其值在编译时已知"和"添加" const修饰符本身?

3 个答案:

答案 0 :(得分:9)

const修饰符严重改变了财产的合同。

例如,如果您有常规属性,则可以向其添加特殊的getter,而不会影响使用它的代码。

另一方面,您必须重新编译用户代码才能删除const并添加getter。换句话说,你失去了在一个领域拥有一个财产的优势。

答案 1 :(得分:2)

此类关键字有助于两种方式:

  • 它们允许编译器做出更强的假设。这使得A)各种优化技术B)更严格的检查。如果您声明某些内容为const,编译器可以在您尝试更改时轻拍手指。
  • 他们表达 意图。请记住,您不编写代码以使编译器满意 - 而是与稍后阅读此代码的其他人进行通信。

含义:如果你今天没有在你的源代码中放下 const - 但你也没有语句修改那个字段......这是否意味着你打算把这个值变成一个常数吗?你是否介意其他人添加在某个地方重新分配该字段的代码?通过使用const,您明确表示您希望这种情况发生。

答案 2 :(得分:0)

我发现Christophe Beyls's article有助于理解使用const的“编译时优化”。

公共const vals将转换为可直接访问的值。公共vals将转换为私有字节码值,并生成合成的getter。

您可以通过在Intellij或Android Studio中打开Kotlin字节码查看器,为某些测试值创建object,并查看为val与{{1}生成的合成方法来自行尝试}}。

我正在使用一个定义大约200个常量的对象,当它们全部标记为const val时会生成一个小得多的文件。