在kotlin中,如果变量可以为空,那么kotlin将要求使用!!或使用前检查null . 在具有可空类成员的情况下,在该类内部任何地方裁判该成员kotlin将警告检查可空 .
class ClassWithNullableMemebr {
Var nullableMember: OtherClass? = null;
constructor (obj: OtherClass) {
nullableMember = obj
}
fun foo() {
nullableMember!!.doSomething()
}
fun getTheOtherClassMember : OtherClass {
return nullableMember!!
}
}
如果保证nullableMember在构造函数中初始化,如何避免使用!!
在Java或其他语言中,他们可以检查null一次并抛出if if by design,该成员永远不应为null . 然后在课堂内成员将被引用而不用担心 .
有人建议这样做
if (nullableMember != null) {
nullableMember!!.doSomething()
}
这仍然需要!!甚至在检查之后,它使代码看起来不漂亮 .
对于这种情况真的使用?与使用没什么不同!!因为nullableMember是在构造函数中赋值的,而函数返回它无法避免!!
我想如果在实例化类之后,这个nullableMember保证不为null!不应该被认为是糟糕的编码风格 . 而且没有其他方法可以避免它 .
有没有人建议避免使用'!!'在这样的情况下?
3 回答
如果保证在构造函数上初始化,那么它根本不需要为空 .
你可以有:
如果您确定该变量的值不为null,则应将其定义为不可为空 .
在此之后,有两种方法可以避免编译器警告和视觉变量初始化:
请注意,如果您在初始化之前尝试访问此变量,则会抛出异常
你可以找到这两者之间的差异here.
如果需要在代码中的某处将此变量的值设置为null,我担心您将不得不使用 !! 因为没有更好的方法来执行此操作 .
在你的情况下,它不是 . 如果你调用辅助构造函数,它将被初始化,但你也有主要的无参数构造函数,它将它初始化为
null
.如果保证在构造函数中将其初始化为非null,那么就像Oliver 's comment says, it shouldn'可以为空!它应该是
val
,如果它只在构造函数(包括次要的)或init
块中设置 .即这个类应该简化为