为可空 class 成员使用 Kotlin double-bang 的推荐方法是什么
what is the recommended way for using the Kotlin double-bang for nullable class member
在 kotlin 中,如果变量可以为空,kotlin 将要求使用 !!或在使用前检查 null。
在具有可空 class 成员的情况下,在 class 内任何引用该成员的地方 kotlin 都会警告检查是否可为空。
class ClassWithNullableMemebr {
Var nullableMember: OtherClass? = null;
constructor (obj: OtherClass) {
nullableMember = obj
}
fun foo() {
nullableMember!!.doSomething()
}
fun getTheOtherClassMember : OtherClass {
return nullableMember!!
}
}
如果保证在构造函数中初始化nullableMember,如何避免使用!!。
在 Java 或其他语言中,他们可以检查一次 null 并在设计成员永远不为 null 时抛出。然后在 class 中,该成员将被毫无顾虑地引用。
有人建议
if (nullableMember != null) {
nullableMember!!.doSomething()
}
这还需要!!即使在检查之后,它也使代码看起来不漂亮。
对于这种情况,真的使用 ?。与使用没有太大区别!由于在构造函数中分配了 nullableMember,并且函数 return 它无法避免 !!.
我想如果这个 nullableMember 在实例化 class 之后保证不为空!!不应该被认为是糟糕的编码风格。而且没有其他方法可以避免它。
有没有人建议避免使用“!!”在这样的情况下?
如果您确定该变量将具有非空值,则应将其定义为不可空。
在此之后,有两种方法可以避免编译器警告和可见变量初始化:
- lateinit修饰符的用法
lateinit var nullableMember: OtherClass
请注意,如果您尝试在初始化之前访问此变量,将会抛出异常
- notNull() 委托的用法
var nullableMember: OtherClass by Delegates.notNull()
你可以找到这两者的区别
如果代码中某处需要将此变量的值设置为null,恐怕您将不得不使用!!,因为没有更好的方法。
If the nullableMember is guaranteed to initialized in constructor
你的情况不是。如果您调用辅助构造函数,它将被初始化,但您也有将其初始化为 null
的主要无参数构造函数。
而且如果它是保证在构造函数中被初始化为非空,那么正如奥利弗的评论所说,它不应该是可以为空的!如果仅在构造函数(包括次要构造函数)或 init
块中设置,则应为 val
。
即这个 class 应该简化为
class ClassWithNullableMemebr(val nullableMember: OtherClass) {
fun foo() {
nullableMember.doSomething()
}
}
如果保证在构造函数上初始化,那么它根本不需要为空。
您可以拥有:
class ClassWithMember(val member: OtherClass) {
fun foo() {
member.doSomething()
}
}
在 kotlin 中,如果变量可以为空,kotlin 将要求使用 !!或在使用前检查 null。 在具有可空 class 成员的情况下,在 class 内任何引用该成员的地方 kotlin 都会警告检查是否可为空。
class ClassWithNullableMemebr {
Var nullableMember: OtherClass? = null;
constructor (obj: OtherClass) {
nullableMember = obj
}
fun foo() {
nullableMember!!.doSomething()
}
fun getTheOtherClassMember : OtherClass {
return nullableMember!!
}
}
如果保证在构造函数中初始化nullableMember,如何避免使用!!。
在 Java 或其他语言中,他们可以检查一次 null 并在设计成员永远不为 null 时抛出。然后在 class 中,该成员将被毫无顾虑地引用。
有人建议
if (nullableMember != null) {
nullableMember!!.doSomething()
}
这还需要!!即使在检查之后,它也使代码看起来不漂亮。
对于这种情况,真的使用 ?。与使用没有太大区别!由于在构造函数中分配了 nullableMember,并且函数 return 它无法避免 !!.
我想如果这个 nullableMember 在实例化 class 之后保证不为空!!不应该被认为是糟糕的编码风格。而且没有其他方法可以避免它。
有没有人建议避免使用“!!”在这样的情况下?
如果您确定该变量将具有非空值,则应将其定义为不可空。
在此之后,有两种方法可以避免编译器警告和可见变量初始化:
- lateinit修饰符的用法
lateinit var nullableMember: OtherClass
请注意,如果您尝试在初始化之前访问此变量,将会抛出异常
- notNull() 委托的用法
var nullableMember: OtherClass by Delegates.notNull()
你可以找到这两者的区别
如果代码中某处需要将此变量的值设置为null,恐怕您将不得不使用!!,因为没有更好的方法。
If the nullableMember is guaranteed to initialized in constructor
你的情况不是。如果您调用辅助构造函数,它将被初始化,但您也有将其初始化为 null
的主要无参数构造函数。
而且如果它是保证在构造函数中被初始化为非空,那么正如奥利弗的评论所说,它不应该是可以为空的!如果仅在构造函数(包括次要构造函数)或 init
块中设置,则应为 val
。
即这个 class 应该简化为
class ClassWithNullableMemebr(val nullableMember: OtherClass) {
fun foo() {
nullableMember.doSomething()
}
}
如果保证在构造函数上初始化,那么它根本不需要为空。
您可以拥有:
class ClassWithMember(val member: OtherClass) {
fun foo() {
member.doSomething()
}
}