В Java 8 мы увидели, что в нашу жизнь вошел необязательный. В отличие от Stream API, я думаю, что это несколько недостаточно используемая функция.

Одно из его прекрасных применений - в ваших классах данных, вместо ваших простых геттеров вы можете обернуть его Optional и иметь лучшую нулевую безопасность.

Я постараюсь продемонстрировать это на примере. Предположим, у вас есть класс данных, такой как MySuperCoolDataObject, только с простым геттером:

public class MySuperCoolDataObject {
    private String myString;

    public String getMyString() {
        return myString;
    }
}

Может ли myString быть нулевым? Может быть, дело в том, что ты не знаешь. Этот объект может быть сериализован из некоторой полезной нагрузки JSON или создан в другой части системы. Итак, у вас, вероятно, будет следующий код или какой-то его вариант везде, где вы его используете.

String myString = coolDataObject.getMyString();
if (myString != null) {
    // only now do something with it
}

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

В первых двух случаях, когда это поле допускает значение NULL, что, если создатель класса данных был достаточно любезен, чтобы четко заявить о своем намерении?

Это необязательно может помочь нам и создать следующий код:

public class MySuperCoolDataObject {
    private String myString;

    public Optional<String> getMyString() {
        return Optional.ofNullable(myString);
    }
}

Здесь вы не можете забыть о том, что этот геттер может возвращать значение null. У вас на одно ужасное исключение NullPointerException, о котором нужно беспокоиться, меньше. И вы можете наслаждаться всеми преимуществами, которые Optional предоставляет вам для написания лучшего кода.

Но написание этого нового метода получения занимает некоторое время и может раздражать после многократного выполнения. Создать получатель - это простая команда в любой Java IDE. Что, если мы создадим необязательный получатель более простым способом?

Прежде чем показать способ пользовательской проверки, я хотел бы отметить, что вы можете использовать собственные возможности Intellij IDEA и изменить геттер, чтобы он возвращал Optional типа. Используя ярлык демонстрации намерений, Intellij любезно предлагает нам обернуть возвращаемое значение, используя Optional:

И вы получите тот же результат, что и дополнительный класс данных.

Итак, позвольте мне показать вам способ индивидуальной проверки!

Одним из многих инструментов, которые предлагает вам Intellij IDEA, является структурная замена. Его можно использовать разными способами для улучшения нашего кода и скорости написания. Итак, давайте посмотрим, как мы можем использовать его в своих интересах для создания необязательного получателя.

Сначала откройте диалоговое окно проверки:

В открывшемся диалоговом окне найдите Проверка структурного поиска.

Включите его и добавьте новый шаблон замены:

И теперь вы можете наслаждаться этим:

Не забудьте изменить степень серьезности на ту, которую вы считаете лучшей (возможно, не значение по умолчанию: предупреждения).

Так что наслаждайтесь своими новыми возможностями писать лучший код и быстрее!

Некоторые примечания:

  1. Как и все остальное, используйте Optional с осторожностью. Иногда это может раздражать.
  2. Если вы уже знакомы с инструментом пользовательской проверки, я хотел бы, чтобы вы поделились своим опытом использования этого инструмента.

Далее говорится:

[1] https://www.jetbrains.com/help/idea/creating-custom-inspections.html

Создание индивидуального насекомого - руководство по реактивным мозгам

[2] https://www.youtube.com/watch?time_continue=3339&v=Ej0sss6cq14

Отличный разговор о том, как правильно использовать Optional и его полномочиях.

[3] http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

[4] https://blog.jetbrains.com/idea/2017/08/code-smells-null/

Две отличные статьи о Optionals.