2

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

所以在声明中将改为这样:var binding: EditInsuranceDialogBinding? = null,在中初始化onCreateContentViewnullonDestroyView

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

4

2 回答 2

1

但一位同事说“这是一种不好的做法,Binding 对象应该是可选的。”

您的同事可能真的意味着绑定对象应该被包裹在Optional.

我想知道什么是最好的选择绑定类型(可选或不)?

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

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

private lateinit var binding: EditInsuranceDialogBinding

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

您选择的替代方案是合理的:

private var binding: EditInsuranceDialogBinding? = null

...你binding在哪里设置nullonDestroyView()

你也可以选择:

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

...你binding回到Optional.empty()的地方onDestroyView()。您还可以使用自定义绑定委托,例如这个

并且lateinit在编译器和内存中花费很多吗?

不。

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

我尝试仅lateinit在我非常确定我会在使用前对其进行初始化时使用。

于 2021-06-11T13:59:12.843 回答
1

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

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

于 2021-06-11T13:57:58.507 回答