Рубрики
Без рубрики

Примечания по безопасности пружины

Краткое и практическое руководство по аннотациям нулевой безопасности весной.

Автор оригинала: Nguyen Nam Thai.

1. Обзор

Начиная с весны 5, у нас теперь есть доступ к интересной функции, помогающей нам писать более безопасный код. Эта функция называется нулевой безопасностью, группой аннотаций, работающих как защита, которая следит за потенциальными нулевыми ссылками.

Вместо того, чтобы позволить нам уйти с небезопасным кодом, функция нулевой безопасности выдает предупреждения во время компиляции. Такие предупреждения могут предотвратить катастрофические исключения нулевых указателей (NPE) во время выполнения.

2. Аннотация @NonNull

Аннотация @NonNull является наиболее важной среди всех аннотаций функции нулевой безопасности. Мы можем использовать эту аннотацию t0 объявить ненулевое ограничение в любом месте, где ожидается ссылка на объект: поле, параметр метода или возвращаемое значение метода.

Предположим, у нас есть класс с именем Person :

public class Person {
    private String fullName;

    void setFullName(String fullName) {
        if (fullName != null && fullName.isEmpty()) {
            fullName = null;
        }
        this.fullName = fullName;
    }

    // getter
}

Это определение класса допустимо, но имеет дефект – поле FullName может быть установлено в null . Если это произойдет, мы можем получить NPE при работе с полное имя .

Функция нулевой безопасности пружины позволяет инструментам сообщать о такой опасности. Например, если мы напишем код в IntelliJ IDEA и украсим поле полное имя аннотацией @NonNull , мы увидим предупреждение:

Благодаря этому показанию мы заранее знаем о проблеме и можем предпринять соответствующие действия, чтобы избежать сбоя во время выполнения.

3. Аннотация @Notnullfields

Аннотация @NonNull полезна для обеспечения безопасности null. Однако мы бы загрязнили всю базу кода, если бы украсили все ненулевые поля этой аннотацией.

Мы можем избежать злоупотребления @NonNull с помощью другой аннотации – @NonNullFields . Эта аннотация применима на уровне пакета, уведомляя наши инструменты разработки о том, что все поля в аннотированном пакете по умолчанию не являются нулевыми.

Чтобы аннотация @NonNullFields заработала, нам нужно создать файл с именем package-info.java в корневом каталоге пакета и аннотируйте пакет с помощью @NonNullFields :

@NonNullFields
package org.baeldung.nullibility;

Давайте объявим другое свойство в классе Person , называемое nickName :

package org.baeldung.nullibility;

// import statements

public class Person {
    private String nickName;

    void setNickName(@Nullable String nickName) {
        if (nickName != null && nickName.isEmpty()) {
            nickName = null;
        }
        this.nickName = nickName;
    }

    // other declarations
}

На этот раз мы не украшаем поле nickName с помощью @NonNull , но все равно видим аналогичную оговорку:

Аннотация @Notnullfields делает наш код менее подробным, обеспечивая тот же уровень безопасности, что и @NonNull .

4. Аннотация @Nullable

Аннотация @NonNullFields обычно предпочтительнее, чем @NonNull , поскольку она помогает уменьшить шаблонность. Иногда мы хотим освободить некоторые поля от ненулевого ограничения, указанного на уровне пакета.

Давайте вернемся к полю Ник и украсим его аннотацией @Nullable :

@Nullable
private String nickName;

Предупреждение, которое мы видели раньше, теперь исчезло:

В этой ситуации мы использовали аннотацию @Nullable для переопределения семантики @Notnullfields в поле.

5. Аннотация @NonNullApi

Аннотация @Notnullfields применяется только к полям, как следует из ее названия. Если мы хотим иметь такое же влияние на параметры методов и возвращаемые значения, нам понадобится @NonNullApi .

Как и в случае с @NonNullFields , мы должны указать аннотацию @NonNullApi в package-info.java файл:

@NonNullApi
package org.baeldung.nullibility;

Давайте определим геттер для поля Ник :

package org.baeldung.nullibility;

// import statements

public class Person {
    @Nullable
    private String nickName;

    String getNickName() {
        return nickName;
    }

    // other declarations
}

При действии аннотации @Nonnull выдается предупреждение о возможном null значении, полученном методом getNickName :

Обратите внимание, что, как и в аннотации @Notnullfields , мы можем переопределить @NonNullApi на уровне метода с помощью аннотации @Nullable .

6. Заключение

Пружинная нулевая безопасность-отличная функция, которая помогает уменьшить вероятность NPE. Однако есть два важных момента, которых мы должны остерегаться при использовании этой функции:

  • Его можно использовать только в вспомогательном инструменте разработки, таком как IntelliJ IDEA
  • Он не применяет проверки null во время выполнения – нам все равно нужно самим писать код, чтобы предотвратить NPE

Исходный код этого учебника можно найти на GitHub .