首页 文章

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

提问于
浏览
4

在Kotlin有:

  • val - 只读属性

  • const val - 编译时常量

来自documentation

编译时常量使用const修饰符可以将编译时已知的值属性编译为编译时常量 . 此类属性需要满足以下要求:顶级或对象成员使用String类型或基本类型初始化无自定义getter

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

  • 为什么编译器需要程序员的帮助?

  • 它不能单独识别"properties the value of which is known at compile time"和"add" const 修饰符吗?

3 回答

  • 2

    const 修饰符严重改变了 property 的 Contract .

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

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

  • 7

    这些关键字有助于 two 方式:

    • 它们允许编译器做出更强的假设 . 这使得A)各种优化技术B)更严格的检查 . 如果您声明某些东西是 const ,编译器可以在您尝试更改它时拍打手指 .

    • 他们表达 intention . 请记住,您不编写代码以使编译器满意 - 而是与稍后阅读此代码的其他人进行通信 .

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

  • 0

    我发现Christophe Beyls's article有助于理解使用 const 的"compile-time optimization" .

    Public const vals 将转换为直接访问的值 . Public vals 被转换为私有字节码值,并生成合成的getter .

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

    我'm working with an object that defines about 200 constants, and a much smaller file is generated when they'全部标记为 const val .

相关问题