Мне нужен совет по нулевой безопасности в Java

Я читал статьи о том, чтобы быть ноль-безопасным в Java, и как это плохо return null или того греха, который проходит null в качестве аргумента. Я понимаю, что это упрощает жизнь, и люди не всегда читают документацию, поэтому они не знают, может ли метод return null, или если null может быть передано к нему. Аннотации, кажется, просто загрязняют код, и нет никакого подобного Kotlin механизма нулевой безопасности. В моем текущем проекте я стараюсь спроектировать все таким образом, чтобы нуль почти не требовался, по крайней мере, для конечного пользователя.

Я хочу создать слушателя изменений (что-то вроде javafx.beans.value.ChangeListener), так что я могу передать предыдущее и текущее значение в changed() метод. Дело в том, что я хочу, чтобы это было абсолютно безопасно, поэтому я не хочу когда-либо проходить null в качестве аргумента, даже если он может измениться от какого-либо значения до некоторого значения или от какого-то значения до какого-либо значения. Я мог бы добавить два дополнительных метода для этой ситуации и получить что-то вроде:

public inteface ChangeListener<T> {
    void valueSet(T current);
    void valueChanged(T previous, T current);
    void valueCleared(T previous);
}

Этот подход кажется чрезмерным. Я также мог бы использовать java.util.Optional<T> в качестве аргументов, но это добавляет дополнительный бокс:

public inteface ChangeListener<T> {
    void changed(Optional<T> previous, Optional<T> current);
}

Есть ли более элегантный вариант? Или я должен заставить пользователя использовать своего рода шаблон пустых объектов? Хотя это создаст проблемы с необходимостью расширения некоторых классов. Я мог бы также перестать заботиться, указать в документации, что произойдет, если null используется и позволяет пользователю найти источник всех исключений NullPointerException.

1 ответ

Решение

Будьте немного осторожны, когда люди говорят вам: "XYZ считается вредным". Я видел, как люди покончили с конструкторами в пользу фабричных методов (таких как Optional.of(...)), но, как и во всем, нет единого правильного ответа.

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

Если ваши пользователи API - идиоты, и они не читают документацию, это не ваша проблема. Null не является чем-то грязным; это означает "неопределенный". Сомнительно использовать null, если произошло что-то неожиданное, например, "файл не найден", что в идеале должно решаться с помощью исключения.

Если "undefined" является правильным представлением неустановленного значения в вашем API, то нет ничего плохого в использовании null.

Другие вопросы по тегам