Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于可为null的类成员,建议使用Kotlin double bang的方法是什么_Kotlin_Nullable - Fatal编程技术网

对于可为null的类成员,建议使用Kotlin double bang的方法是什么

对于可为null的类成员,建议使用Kotlin double bang的方法是什么,kotlin,nullable,Kotlin,Nullable,在kotlin中,如果变量可为null,kotlin将要求使用!!或者在使用它之前检查空值。 在拥有可为null的类成员的情况下,在该成员所在的类中,kotlin将警告检查可为null的类 class ClassWithNullableMemebr { Var nullableMember: OtherClass? = null; constructor (obj: OtherClass) { nullableMember = obj }

在kotlin中,如果变量可为null,kotlin将要求使用!!或者在使用它之前检查空值。 在拥有可为null的类成员的情况下,在该成员所在的类中,kotlin将警告检查可为null的类

class ClassWithNullableMemebr {
      Var nullableMember: OtherClass? = null;

      constructor (obj: OtherClass) {
          nullableMember = obj
      }
      fun foo() {
          nullableMember!!.doSomething()
      }
      fun getTheOtherClassMember : OtherClass {
          return nullableMember!!
      }
 }
如果保证在构造函数中初始化nullableMember,如何避免使用

在Java或其他语言中,他们可以检查null一次,并在设计时抛出成员是否永远不应该为null。然后在类中,成员将被引用而不必担心

有人建议你这样做

if (nullableMember != null) {
    nullableMember!!.doSomething()
}
这将仍然需要!!即使在检查之后,它也会使代码看起来不漂亮

对于这种情况,真的使用了?。与使用没有太大区别!!由于nullableMember是在构造函数中赋值的,并且函数返回,所以它不能避免

我认为如果在使用!!不应该被认为是糟糕的编码风格。没有其他办法可以避免


是否有人建议避免使用“!!”在这种情况下

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

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

  • lateinit修饰符的用法
  • lateinit var nullableMember:其他类

    请注意,如果您试图在初始化之前访问此变量,将引发异常

  • 使用notNull()委托
  • var nullablember:OtherClass by Delegates.notNull()

    你可以发现这两者之间的区别


    如果需要在代码中的某个地方将此变量的值设置为null,恐怕您必须使用因为没有更好的方法可以做到这一点。

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

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

  • lateinit修饰符的用法
  • lateinit var nullableMember:其他类

    请注意,如果您试图在初始化之前访问此变量,将引发异常

  • 使用notNull()委托
  • var nullablember:OtherClass by Delegates.notNull()

    你可以发现这两者之间的区别

    如果需要在代码中的某个地方将此变量的值设置为null,恐怕您必须使用因为没有比这更好的方法了

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

    你的情况不是这样。如果您调用辅助构造函数,它将被初始化,但是您还有一个主的无参数构造函数,它将它初始化为
    null

    如果它保证在构造函数中被初始化为非null,那么正如Oliver的评论所说,它不应该为null!如果仅在构造函数(包括辅助构造函数)或
    init
    块中设置,则应为
    val

    即该类应简化为

    class ClassWithNullableMemebr(val nullableMember: OtherClass) {
        fun foo() {
            nullableMember.doSomething()
        }
    }
    
    如果保证在构造函数中初始化nullableMember

    你的情况不是这样。如果您调用辅助构造函数,它将被初始化,但是您还有一个主的无参数构造函数,它将它初始化为
    null

    如果它保证在构造函数中被初始化为非null,那么正如Oliver的评论所说,它不应该为null!如果仅在构造函数(包括辅助构造函数)或
    init
    块中设置,则应为
    val

    即该类应简化为

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

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

    你可以有:

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

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

    你可以有:

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

    如果它被保证为非null,那么为什么不让它为非null?如果它被保证为非null,那么为什么不让它为非null?