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

在Kotlin有:

  • val – 只读属性
  • const val – 编译时常量

从文档 :

编译时常量

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

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

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

  • 为什么编译器需要程序员的帮助?
  • 它不能识别“编译时已知的属性的属性”和“增加” const修饰符本身?

const修饰符会严重地改变属性的合同。

例如,如果你有一个普通的属性,你可以添加一个特殊的getter而不影响使用它的代码。

另一方面,你将不得不重新编译用户代码以删除const并添加getter。 换句话说,你放弃了在一个领域拥有财产的好处。

这样的关键字有两个方面的帮助:

  • 他们允许编译器做出更强的假设。 这使得A)各种优化技术B)更严格的检查。 如果你声明某些东西是const ,编译器可以在你尝试改变的时候敲击你的手指。
  • 他们表达 意图 。 请记住,不要编写代码来使编译器很高兴,而是要在稍后与其他人读取此代码时进行通信。

意思是:如果你今天没有在你的源代码中写下const ,但是你也没有修改这个字段的语句,这是否意味着你希望这个值是一个常量? 你介意别人是否增加了在某个地方重新赋值的代码? 通过使用const你可以清楚地知道你希望发生这种情况。