android - 我们什么时候应该为对象选择 Lateinit ?将绑定(bind)设置为非可选和延迟初始化是一种不好的做法吗?

标签 android binding kotlin-lateinit lateinit

我在 fragment 中被声明为 lateinit var binding: E​​ditInsuranceDialogBinding 中的绑定(bind)对象,但一位同事说“这是一个不好的做法,Binding 对象应该是 可选。”

因此在声明中将改为这样: var binding: E​​ditInsuranceDialogBinding? = null,在onCreateContentView中初始化,并在onDestroyView中设为null

我想知道选择哪种绑定(bind)类型最好(可选或不可选)? lateinit 是否会在编译器和内存方面消耗大量资源?什么时候我们应该选择lateinit,什么时候我们应该使用它?

最佳答案

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

您的同事可能真正的意思是应该将绑定(bind)对象包装在Optional中。

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

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

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

private lateinit var binding: EditInsuranceDialogBinding

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

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

private var binding: EditInsuranceDialogBinding? = null

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

您还可以选择:

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

...您在 onDestroyView() 中将 binding 设置回 Optional.empty() 的位置。还有自定义绑定(bind)委托(delegate),例如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

关于android - 我们什么时候应该为对象选择 Lateinit ?将绑定(bind)设置为非可选和延迟初始化是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67938125/

相关文章:

android - 房间数据库错误 : Migration didn't properly handle

c# - 如何在两个动态生成的组合框上使用不同的值

android - 我有一个代码,其中调用了Lateinit变量后对其进行了初始化,但我不知道如何

javascript - Onsen UI 2.0 如何改变 Material 颜色?

android - ListView 并从项目中的 subview 传播单击事件

android - Gradle 3实现Aar依赖

android - Kotlin:伴随对象 lateinit vars 初始化一次吗?

c# - 母版页 Xamarin 表单上的绑定(bind)字体图标

java - JBoss 绑定(bind) IP 地址

kotlin - 如何在Kotlin中取消初始化Lateinit