带有 `?` 的可空变量 vs. lateinit var

Zor*_*gan 6 android kotlin

在 Kotlin/Android 活动/片段中定义全局变量的最佳方法是什么?

当您应该使用这 2 种方法来定义全局变量时,有哪些不同的场景:

var viewpager: CustomViewPager? = null 
Run Code Online (Sandbox Code Playgroud)

或者

lateinit var viewpager: CustomViewPager
Run Code Online (Sandbox Code Playgroud)

?

如果我使用前者,我将不必在我的代码中检查 null。例如,如果我用于lateinit以下内容:

viewpager = activity?.findViewById<CustomViewPager>(R.id.viewpager) 那么我将不得不检查空值。

a_l*_*ody 12

using lateinit,您是说您绝对会确保在某处创建该变量的实例(否则,如果 alateinit尚未初始化,您的应用程序将抛出异​​常),然后该变量在您的其余部分也不会为空project 与 using 相比null,这意味着该对象可能在项目其余部分的代码中的某处为空,并且您将不得不在整个过程中处理可空性。

如果您确定不会将变量设为 null 并且始终需要它的实例,请使用 lateinit

问自己这个问题:

我是否 100% 确定我将在此类中的某处使用此变量的实例?

如果答案是Yes,您可能应该使用lateinit, 因为lateinit强制您创建它的实例。

如果答案是No,则您可能应该改用可空字段。

取自这里:https : //www.kotlindevelopment.com/lateinit-kotlin/

lateinit 关键字代表后期初始化。当构造函数中不能提供非空初始化器时,lateinit 非常方便,但开发人员确定访问它时变量不会为空,从而避免以后引用它时进行空检查。