私有字符串属性在反编译的.java类Kotlin中可以为空

私有字符串属性在反编译的.java类Kotlin中可以为空,java,android,kotlin,Java,Android,Kotlin,当我在Kotlin类中有一个私有字符串属性并将该类反编译为Java代码时,该属性将不会有@NotNull注释。相反,如果我声明一个“public”字符串属性,它将在反编译代码中包含注释@NotNull 下面是一个.kt示例: class Boo { private var myString : String = "" var myOtherString : String = "" } 和反编译的.java等价物: public final class

当我在Kotlin类中有一个私有字符串属性并将该类反编译为Java代码时,该属性将不会有
@NotNull
注释。相反,如果我声明一个“public”字符串属性,它将在反编译代码中包含注释
@NotNull

下面是一个.kt示例:

   class Boo {

      private var  myString : String = ""
      var myOtherString : String = ""

   }
和反编译的.java等价物:

public final class Boo {
   private String myString = "";
   @NotNull
   private String myOtherString = "";

   @NotNull
   public final String getMyOtherString() {
      return this.myOtherString;
   }

   public final void setMyOtherString(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.myOtherString = var1;
   }

}
公共最终类Boo{
私有字符串myString=“”;
@NotNull
私有字符串myOtherString=“”;
@NotNull
公共最终字符串getMyOtherString(){
返回此.myOtherString;
}
公共最终无效setMyOtherString(@NotNull String var1){
Intrinsics.checkParametersNotNull(var1,“”);
this.myOtherString=var1;
}
}

为什么私有字符串属性不需要
@NotNull

从另一个角度思考:在公共属性上提供
@NotNull
有什么好处(而不是隐藏
@Metadata
中的所有信息)?它对JVM运行时没有任何意义;主要的好处是作为类用户及其工具的文档,因此他们知道
getMyOtherString
从不返回null。但是他们首先不能访问myString,所以没有必要对它进行注释


这并不能完全回答为什么字段
myOtherString
被注释,而不仅仅是getter和setter;我猜这是因为它可以通过
@JvmField
公开,所以在某些情况下编写注释它的代码是必要的,不检查字段是否可见稍微方便一些。

没有理由检查它,因为您知道外部的类不会将它设置为空值。另一方面,如果它是公共的,来自项目外部的恶意对象可能会将其设置为null。@用户您是否希望
val
上没有注释?注释本身实际上没有任何作用。它只向“查看”注释元素的其他代码提供信息。既然在类型外部看不到私有字段,那又有什么意义呢?