我们什么时候应该为对象选择 lateinit ?将绑定设置为非可选和 lateinit 是不好的做法吗?
When should we choose lateinit for an object ? Is it bad practice to make the binding as non-optional and lateinit?
我在片段中被声明为 lateinit var binding: EditInsuranceDialogBinding
的绑定对象,但一位同事说“这是一种不好的做法,Binding 对象应该是 可选 . "
因此在声明中将改为:var binding: EditInsuranceDialogBinding? = null
,在 onCreateContentView
中初始化并在 onDestroyView
中使其成为 null
我想知道什么是最好的绑定类型(可选或不可选)? lateinit 是否在编译器和内存中花费很多?我们什么时候应该 NOT 选择 lateinit 什么时候应该使用它?
这个方法不错。当我们在使用它之前保证初始化时,我们使用 lateinit 。 lateinit 在初始化之前不会分配内存。
只初始化一次。下次使用时,从内存中第一次使用的地方取值。
but a colleague said "This is a bad practice and Binding object should be Optional . "
有可能你同事的意思是绑定对象应该包裹在Optional
.
I want to know what is the best to choose the type of Binding (optional or not)?
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()
的位置。您还可以使用自定义绑定委托,例如 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
。
我在片段中被声明为 lateinit var binding: EditInsuranceDialogBinding
的绑定对象,但一位同事说“这是一种不好的做法,Binding 对象应该是 可选 . "
因此在声明中将改为:var binding: EditInsuranceDialogBinding? = null
,在 onCreateContentView
中初始化并在 onDestroyView
null
我想知道什么是最好的绑定类型(可选或不可选)? lateinit 是否在编译器和内存中花费很多?我们什么时候应该 NOT 选择 lateinit 什么时候应该使用它?
这个方法不错。当我们在使用它之前保证初始化时,我们使用 lateinit 。 lateinit 在初始化之前不会分配内存。
只初始化一次。下次使用时,从内存中第一次使用的地方取值。
but a colleague said "This is a bad practice and Binding object should be Optional . "
有可能你同事的意思是绑定对象应该包裹在Optional
.
I want to know what is the best to choose the type of Binding (optional or not)?
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()
的位置。您还可以使用自定义绑定委托,例如 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
。