Мне нужен совет по нулевой безопасности в 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.