我被声明为片段中的绑定对象lateinit var binding: EditInsuranceDialogBinding
但一位同事说"这是一种不好的做法,绑定对象应该是可选的。
所以在声明中将改为这样:var binding: EditInsuranceDialogBinding? = null
,在onCreateContentView
中初始化并使其null
onDestroyView
我想知道选择绑定类型(可选与否)的最佳选择是什么?后期初始化在编译器和内存中花费很多吗?我们什么时候不应该选择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 在初始化之前不会分配内存。
它仅初始化一次。下次使用它时,您会从首次使用它的内存中获取该值。