kotlin 中 lateinit、lazy、const 的区别

1,053 阅读3分钟

Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。

来自微信小程序「猿面试」每日分享一道大厂面试题,涉及 JavaAndroid鸿蒙和ArkTS设计模式算法和数据结构 等内容。


kotlin 中 lateinit、lazy、const 的区别

在 Kotlin 中,lateinit、lazy 和 const 是用于处理变量初始化和延迟初始化的不同机制。

lateinit var

lateinit 关键字延迟初始化,用于声明一个非空类型的变量,但不立即初始化它。这个变量必须在它第一次被使用之前被初始化,否则会抛出 UninitializedPropertyAccessException 异常。

只能用于类属性(即成员变量),而不能用来修饰局部变量。这是因为 lateinit 的主要目的是允许你在类的实例化过程中延迟初始化某个属性,直到它第一次被明确地赋值。

只能用来修饰对象,不能用来修饰基本类型(因为基本类型在类加载后的准备阶段都会被初始化为默认值)

by lazy

by lazy 通常与 val 关键字一起使用,初始化后属性的值不可变,在 java 中相当于被 final 修饰,它提供了一种延迟初始化变量的方式。变量只有在第一次被访问时才会被初始化,并且之后的访问都会返回相同的值。

const val

val 用来声明只读变量。也就相当于,java 中 final 修饰的变量。在 Java 中会生成一个带有 getter 方法的属性。因此,你不能在 Java 中直接访问 val 变量,而是需要通过它的 getter 方法来访问。

const 声明编译期的常量,const 修饰的常量需要同时满足以下三个条件:

  • 类型限制:const 只能用于基本数据类型(如 IntLongFloatDoubleBoolean)和 String 类型。

  • 作用域限制:const 只能在顶层(top-level)、object 声明的成员或者 companion object 的成员中使用。

  • const 不能单独修饰某个变量,需要和 val 同时修饰一个变量

在 Kotlin 中声明的 const val 属性实际上是编译时常量。在 Java 中,它们会被视为普通的静态 final 字段,因此你可以 Java 中直接访问它们,就像访问 Java 中的静态 final 字段一样。

更多大厂面试题,欢迎前往微信搜索小程序 「猿面试」 查看。微信小程序 (猿面试) 包含了 Java、Android、鸿蒙和ArkTS设计模式算法和数据结构 相关内容,

更多面试题