Должны ли модели запроса выводить недействительность? - PullRequest
0 голосов
/ 11 июня 2019

С учетом модели запроса, например,

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;
}

Бизнес-логика выполняется вне моего приложения.Backend будет игнорировать любые дополнительные данные, которые я включаю или исключаю.Я чувствую, что в этом нет необходимости, однако сотрудник утверждает, что по умолчанию в аннотациях используется @NotNull, поэтому определение @Nullable поможет.Это правда?Я не могу найти документацию по этому поводу.

1 Ответ

1 голос
/ 12 июня 2019

Ваш сотрудник неверен;то, что кажется NotNull, фактически является инструментом статического анализа LINT, не намекающим на потенциальный ноль.

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 отсутствует предупреждение о передаче значения NULL.

Однако в явно аннотированной версии (void someMethod(@NonNull String str) {) LINT четко обнаруживает, что myStr не инициализирован (попробуйте даже вызвать как someMethod(null) и найдите разницу).

В любом случае, в конце концов, аннотации - это просто подсказки, позволяющие принимать решения компилятору или процессору аннотации;он также используется плагином Android Studio и LINT.В конечном счете, решение использовать или не использовать аннотации также сводится к личным предпочтениям.Тем не менее, с ростом Kotlin, эти аннотации становятся важными для взаимодействия обоих языков.

Наконец, стоит отметить, что компилятор Java не остановит вас от компиляции указанного небезопасного кода, независимо от аннотаций.так что имейте это в виду.Я лично предпочитаю иметь их (даже если я думаю, что они выглядят неуклюже), потому что они заявляют о четком намерении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...