私有字符串属性在反编译的.java类Kotlin中可以为空
当我在Kotlin类中有一个私有字符串属性并将该类反编译为Java代码时,该属性将不会有私有字符串属性在反编译的.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
@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
上没有注释?注释本身实际上没有任何作用。它只向“查看”注释元素的其他代码提供信息。既然在类型外部看不到私有字段,那又有什么意义呢?