请求模型应该推断无效吗?
Should request models infer nullity?
给定一个请求模型,例如
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 会有所帮助。这是真的?我找不到关于此的文档。
您的co-worker不正确;看起来是 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 都会在这里警告我,在带注释的版本中,但这只是因为我 明确地 说它可以为 null 并且 LINT 认为我没有检查。
您的同事误认为第一个版本不为空。调用时可以发现差异:
String myStr;
someMethod(myStr);
在 non-annotated 版本 (void someMethod(String str) {
) 中,默认情况下 LINT 中没有关于传递 null 的警告。
但是在 明确注释的 版本 (void someMethod(@NonNull String str) {
) 中,LINT 清楚地检测到 myStr 未初始化(甚至尝试调用 someMethod(null)
并发现差异)。
无论如何,在一天结束时,注释只是提示,以便编译器或注释的处理器可以做出决定; Android Studio plug-in 和 LINT 也使用它。最终,使用或不使用注释的决定也归结为个人喜好。也就是说,随着 Kotlin 的发展,这些注解在两种语言的互操作性中变得很重要。
最后,值得一提的是 Java 编译器不会阻止您编译上述不安全代码,无论注释如何,因此请记住这一点。我个人更喜欢拥有它们(尽管我认为它们看起来很笨拙),因为它们表达了明确的意图。
给定一个请求模型,例如
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 会有所帮助。这是真的?我找不到关于此的文档。
您的co-worker不正确;看起来是 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 都会在这里警告我,在带注释的版本中,但这只是因为我 明确地 说它可以为 null 并且 LINT 认为我没有检查。
您的同事误认为第一个版本不为空。调用时可以发现差异:
String myStr;
someMethod(myStr);
在 non-annotated 版本 (void someMethod(String str) {
) 中,默认情况下 LINT 中没有关于传递 null 的警告。
但是在 明确注释的 版本 (void someMethod(@NonNull String str) {
) 中,LINT 清楚地检测到 myStr 未初始化(甚至尝试调用 someMethod(null)
并发现差异)。
无论如何,在一天结束时,注释只是提示,以便编译器或注释的处理器可以做出决定; Android Studio plug-in 和 LINT 也使用它。最终,使用或不使用注释的决定也归结为个人喜好。也就是说,随着 Kotlin 的发展,这些注解在两种语言的互操作性中变得很重要。
最后,值得一提的是 Java 编译器不会阻止您编译上述不安全代码,无论注释如何,因此请记住这一点。我个人更喜欢拥有它们(尽管我认为它们看起来很笨拙),因为它们表达了明确的意图。