在Kotlin有:
val
- readonly property const val
- 编译时常量编译时间常数
编译时已知的值的属性可以使用
const
修饰符标记为编译时常量。这些属性需要满足以下要求:
- 对象的顶级或成员
- 使用String类型或基本类型
初始化- 没有自定义getter
鉴于kotlin编译器确实知道识别初始值(例如不需要在初始化器中定义变量类型):
const
修饰符本身?答案 0 :(得分:9)
const
修饰符严重改变了财产的合同。
例如,如果您有常规属性,则可以向其添加特殊的getter,而不会影响使用它的代码。
另一方面,您必须重新编译用户代码才能删除const
并添加getter。换句话说,你失去了在一个领域拥有一个财产的优势。
答案 1 :(得分:2)
此类关键字有助于两种方式:
const
,编译器可以在您尝试更改时轻拍手指。含义:如果你今天没有在你的源代码中放下 const - 但你也没有语句修改那个字段......这是否意味着你打算把这个值变成一个常数吗?你是否介意其他人添加在某个地方重新分配该字段的代码?通过使用const
,您明确表示您不希望这种情况发生。
答案 2 :(得分:0)
我发现Christophe Beyls's article有助于理解使用const
的“编译时优化”。
公共const vals
将转换为可直接访问的值。公共vals
将转换为私有字节码值,并生成合成的getter。
您可以通过在Intellij或Android Studio中打开Kotlin字节码查看器,为某些测试值创建object
,并查看为val
与{{1}生成的合成方法来自行尝试}}。
我正在使用一个定义大约200个常量的对象,当它们全部标记为const val
时会生成一个小得多的文件。