我们什么时候应该为对象选择 lateinit ?将绑定设置为非可选和 lateinit 是不好的做法吗?

When should we choose lateinit for an object ? Is it bad practice to make the binding as non-optional and lateinit?

我在片段中被声明为 lateinit var binding: EditInsuranceDialogBinding 的绑定对象,但一位同事说“这是一种不好的做法,Binding 对象应该是 可选 . "

因此在声明中将改为:var binding: EditInsuranceDialogBinding? = null,在 onCreateContentView 中初始化并在 onDestroyView

中使其成为 null

我想知道什么是最好的绑定类型(可选或不可选)? lateinit 是否在编译器和内存中花费很多?我们什么时候应该 NOT 选择 lateinit 什么时候应该使用它?

这个方法不错。当我们在使用它之前保证初始化时,我们使用 lateinit 。 lateinit 在初始化之前不会分配内存。

只初始化一次。下次使用时,从内存中第一次使用的地方取值。

but a colleague said "This is a bad practice and Binding object should be Optional . "

有可能你同事的意思是绑定对象应该包裹在Optional.

I want to know what is the best to choose the type of Binding (optional or not)?

lateinit var 不是邪恶的。然而,它并不适用于所有情况。

在这种情况下,绑定对象具有特定的生命周期,我们需要在onDestroyView()之后停止使用它。如果您将 属性 声明为:

private lateinit var binding: EditInsuranceDialogBinding

...那么您无法在 onDestroyView() 之后将其设置为“我们没有有效绑定”的内容。很容易在 onDestroyView() 之后运行的片段中包含代码,并且该代码需要知道使用绑定是不安全的。无法创建表示“使用绑定不安全”状态的 EditInsuranceDialogBinding 实例。

您选择的选项是合理的:

private var binding: EditInsuranceDialogBinding? = null

...在 onDestroyView() 中将 binding 设置为 null

你也可以选择:

private var binding: Optional<EditInsuranceDialogBinding> = Optional.empty()

...您在 onDestroyView() 中将 binding 设置回 Optional.empty() 的位置。您还可以使用自定义绑定委托,例如 this one

and does lateinit cost a lot in the compiler and memory ?

没有

When we should NOT choose lateinit and when we should use it?

当我非常确定我会在使用前初始化它时,我尝试只使用lateinit