Kotlin:为什么编译器需要`const`修饰符?
在Kotlin有:
-
val
– 只读属性 -
const val
– 编译时常量
从文档 :
编译时常量
在编译时已知其值的属性可以使用
const
修饰符标记为编译时间常量。 这些属性需要满足以下要求:
- 对象的顶级或成员
- 使用String类型的值或基元类型初始化
- 没有自定义的getter
鉴于kotlin编译器确实知道识别初始化值(例如,在初始化器中不需要定义变量类型):
- 为什么编译器需要程序员的帮助?
- 它不能识别“编译时已知的属性的属性”和“增加”
const
修饰符本身?
const
修饰符会严重地改变属性的合同。
例如,如果你有一个普通的属性,你可以添加一个特殊的getter而不影响使用它的代码。
另一方面,你将不得不重新编译用户代码以删除const
并添加getter。 换句话说,你放弃了在一个领域拥有财产的好处。
这样的关键字有两个方面的帮助:
- 他们允许编译器做出更强的假设。 这使得A)各种优化技术B)更严格的检查。 如果你声明某些东西是
const
,编译器可以在你尝试改变的时候敲击你的手指。 - 他们表达 意图 。 请记住,不要编写代码来使编译器很高兴,而是要在稍后与其他人读取此代码时进行通信。
意思是:如果你今天没有在你的源代码中写下const ,但是你也没有修改这个字段的语句,这是否意味着你希望这个值是一个常量? 你介意别人是否增加了在某个地方重新赋值的代码? 通过使用const
你可以清楚地知道你不希望发生这种情况。