给出一个请求模型,例如
public class Profile {
@SerializedName("first_name")
public String firstName;
@SerializedName("last_name")
public String lastName;
@SerializedName("full_name")
public String fullName;
}
推断无效性是否有任何价值?例如,
public class Profile {
@Nullable
@SerializedName("first_name")
public String firstName;
@Nullable
@SerializedName("last_name")
public String lastName;
@Nullable
@SerializedName("full_name")
public String fullName;
}
业务逻辑在我的应用程序外部完成。后端将忽略我包含或排除的所有额外数据。我觉得这是不必要的,但是,一位同事声称默认情况下注解使用@NotNull,因此指定@Nullable会有所帮助。这是真的?我找不到有关此文档。
答案 0 :(得分:1)
您的同事不正确;实际上,看起来不是NotNull的是LINT静态分析工具并未暗示潜在的null。
void someMethod(String str);
void someMethod(@NotNull String str);
void someMethod(@Nullable String str);
对于这三个签名,字节码是相同的(据我所知,至少在Java 1.8中如此)。区别在于,默认情况下,LINT仅在您违反明确的合同时才会警告您。
想象一下,每种方法的无用实现如下:
void someMethod(String str) {
str.toString();
}
void someMethod(@NotNull String str) {
str.toString();
}
void someMethod(@Nullable String str) {
str.toString();
}
所有LINT都会在这里给我警告,它们都在带注释的版本中,但这只是因为我明确地说它可以为空,并且LINT看到我没有检查。
您的同事错误的地方是假设第一个版本不为空。调用时可以发现差异:
String myStr;
someMethod(myStr);
在未注释版本(void someMethod(String str) {
)中,默认情况下,LINT中没有关于传递空值的警告。
但是,在带注释的版本(void someMethod(@NonNull String str) {
中),LINT清楚地检测到myStr尚未初始化(甚至像someMethod(null)
一样调用并找出差异)。
无论如何,总而言之,注释就是提示,以便编译器或注释的处理器可以做出决定。 Android Studio插件和LINT也使用它。最终,决定是否使用注释也归结为个人喜好。话虽如此,随着Kotlin的发展,这些注释在两种语言的互操作性中变得非常重要。
最后,值得一提的是,无论注释如何,Java编译器都不会阻止您编译所说的不安全代码,因此也请记住这一点。我个人更喜欢使用它们(甚至认为它们看起来很笨拙),因为它们表明了明确的意图。