首页 文章

什么是使用Kotlin双爆为可空类成员的推荐方法

提问于
浏览
0

在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 回答

  • 2

    如果保证在构造函数上初始化,那么它根本不需要为空 .

    你可以有:

    class ClassWithMember(val member: OtherClass) {
      fun foo() {
          member.doSomething()
      }
    }
    
  • 1

    如果您确定该变量的值不为null,则应将其定义为不可为空 .

    在此之后,有两种方法可以避免编译器警告和视觉变量初始化:

    • lateinit 修饰符的用法

    lateinit var nullableMember:OtherClass

    请注意,如果您在初始化之前尝试访问此变量,则会抛出异常

    • notNull() 委托的用法

    var nullableMember:Delegates.notNull()的OtherClass

    你可以找到这两者之间的差异here.

    如果需要在代码中的某处将此变量的值设置为null,我担心您将不得不使用 !! 因为没有更好的方法来执行此操作 .

  • 1

    如果保证nullableMember在构造函数中初始化

    在你的情况下,它不是 . 如果你调用辅助构造函数,它将被初始化,但你也有主要的无参数构造函数,它将它初始化为 null .

    如果保证在构造函数中将其初始化为非null,那么就像Oliver 's comment says, it shouldn'可以为空!它应该是 val ,如果它只在构造函数(包括次要的)或 init 块中设置 .

    即这个类应该简化为

    class ClassWithNullableMemebr(val nullableMember: OtherClass) {
        fun foo() {
            nullableMember.doSomething()
        }
    }
    

相关问题