微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

解决方法

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

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

,

但一位同事说“这是一个不好的做法,绑定对象应该是 Optional 。”

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

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

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

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

private lateinit var binding: EditInsuranceDialogBinding

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

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

private var binding: EditInsuranceDialogBinding? = null

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

你也可以:

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

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

lateinit 在编译器和内存方面的开销很大吗?

没有

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。