在Kotlin有:
-
val
- 只读属性 -
const val
- 编译时常量
编译时常量使用const修饰符可以将编译时已知的值属性编译为编译时常量 . 此类属性需要满足以下要求:顶级或对象成员使用String类型或基本类型初始化无自定义getter
鉴于kotlin编译器确实知道识别初始化值(例如,不需要在初始化程序中定义变量类型):
-
为什么编译器需要程序员的帮助?
-
它不能单独识别"properties the value of which is known at compile time"和"add"
const
修饰符吗?
3 回答
const
修饰符严重改变了 property 的 Contract .例如,如果您有常规属性,则可以向其添加特殊的getter,而不会影响使用它的代码 .
另一方面,您必须重新编译用户代码才能删除
const
并添加getter . 换句话说,你失去了在一个领域拥有一个 property 的优势 .这些关键字有助于 two 方式:
它们允许编译器做出更强的假设 . 这使得A)各种优化技术B)更严格的检查 . 如果您声明某些东西是
const
,编译器可以在您尝试更改它时拍打手指 .他们表达 intention . 请记住,您不编写代码以使编译器满意 - 而是与稍后阅读此代码的其他人进行通信 .
含义:如果你今天没有在你的源代码中放下const - 但你也没有修改那个字段的语句......这是否意味着你打算将这个值作为常量?你是否介意其他人添加在某个地方重新分配该字段的代码?通过使用
const
,你明确表示你不希望这种情况发生 .我发现Christophe Beyls's article有助于理解使用
const
的"compile-time optimization" .Public
const vals
将转换为直接访问的值 . Publicvals
被转换为私有字节码值,并生成合成的getter .您可以通过在Intellij或Android Studio中打开Kotlin字节码查看器,为某些测试值创建
object
,并查看为val
与const val
生成的合成方法来自行尝试 .我'm working with an object that defines about 200 constants, and a much smaller file is generated when they'全部标记为
const val
.