面试题答案
一键面试使用场景
- lateinit:适用于对象在声明时未初始化,但在使用前一定会初始化的场景。比如在Android开发中,一些视图绑定变量,在
onCreate
方法中进行初始化。通常用于非空类型的变量,且初始化逻辑在类的生命周期内稍后执行。 - nullable type:适用于对象可能为空的场景。例如,从数据库查询数据时,可能查询结果为空。这种情况下使用可空类型可以灵活处理可能出现的空值情况。
内存管理
- lateinit:在对象未初始化时,不会占用额外的内存空间来表示可能的空值。一旦初始化,其内存占用与普通非空对象相同。
- nullable type:由于可空类型需要额外的空间来表示
null
值,相比非空类型会占用更多的内存。例如,Int
类型占4字节,而Int?
类型除了存储Int
值所需的4字节外,还需要额外的空间来表示null
状态。
空指针安全性
- lateinit:在使用
lateinit
变量前,必须确保已经初始化,否则会抛出UninitializedPropertyAccessException
。在编译时,编译器会通过一些规则检查变量是否在使用前已初始化,以提高空指针安全性。 - nullable type:使用可空类型时,每次访问可空对象都需要进行空值检查,否则可能会抛出
NullPointerException
。可以通过?.
(安全调用操作符)、?:
( Elvis 操作符)等方式进行安全访问,从而避免空指针异常。
总结
- lateinit适合在确定会初始化的非空对象场景,通过编译期检查和运行时异常来保证空指针安全,内存占用与普通对象相同。
- nullable type用于对象可能为空的场景,通过额外内存表示空值,并通过多种操作符进行空值检查来保证空指针安全。