请求模型是否应该推断出无效性?

时间:2019-06-10 23:06:37

标签: android request annotations

给出一个请求模型,例如

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会有所帮助。这是真的?我找不到有关此文档。

1 个答案:

答案 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编译器都不会阻止您编译所说的不安全代码,因此也请记住这一点。我个人更喜欢使用它们(甚至认为它们看起来很笨拙),因为它们表明了明确的意图。