我们什么时候应该为对象选择 lateinit?将绑定设置为非可选和后期绑定是否不好?



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

所以在声明中将改为这样:var binding: EditInsuranceDialogBinding? = null,在onCreateContentView中初始化并使其nullonDestroyView

我想知道选择绑定类型(可选与否)的最佳选择是什么?后期初始化在编译器和内存中花费很多吗?我们什么时候不应该选择lateinit,什么时候应该使用它?

但一位同事说"这是一个不好的做法,绑定对象应该是可选的。

您的同事可能真的想将绑定对象包装在Optional中。

我想知道选择绑定类型(可选与否)的最佳选择是什么?

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()的位置。还可以使用自定义绑定委托,例如此委托。

后期在编译器和内存中花费很多吗?

不。

我们什么时候不应该选择lateinit,什么时候应该使用它?

我尝试仅在非常确定我会在使用前初始化它时才使用lateinit

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

它仅初始化一次。下次使用它时,您会从首次使用它的内存中获取该值。

最新更新