Кажется, растет сообщество людей, говорящих, что вы никогда не должны возвращать null и вместо этого всегда должны использовать шаблон Null Object. Я вижу полезность NOP при использовании коллекции/карты/массива или вызове логических функций, таких как isAuthenticated(), который показан здесь.
Я не нашел ничего, что было бы полностью убедительным. Потерпите меня, пока я пытаюсь привести в порядок свои мысли.
Насколько я понимаю, вместо возврата нулевого объекта вы возвращаете действительный объект, который был «обнулен».
Так, например, клиент сделал бы вызов, чтобы получить объект:
Car car = getCar();
Если вы не используете NOP, вам нужно будет проверить, является ли объект, возвращаемый из getCar(), нулевым, прежде чем вызывать какие-либо методы для него:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
Используя NOP, вместо того, чтобы getCar()
возвращал null, теперь он возвращает объект, который был фактически «обнулен». Так что теперь нам больше не нужно делать if (car != null)
и можно просто запросить цвет. Итак, я предполагаю, что наш «обнуленный» объект вернет «none», когда мы вызовем цвет.
Как это помогает? Кажется, что продвижение вперед и вызов методов для пустого объекта причиняет столько же боли, сколько и простая проверка нуля. Теперь, когда пришло время отображать информацию, нам нужно проверить, что цвет не равен «none», что высота не равна 0 или любым другим значениям, которые у вас есть. Таким образом, вместо того, чтобы в начале обработки проверять, является ли автомобиль нулевым, вы впоследствии проверяете, является ли объект автомобиля реальным автомобилем или его заменой. т.е. мы не хотим отображать кучу пустых объектов, поэтому нам нужен какой-то способ отфильтровать все наши пустые объекты.
Эта фильтрация является дополнительным шагом, как и вызов if (car != null). Единственная разница в том, что при проверке null мы можем остановить обработку, как только обнаружим, что объект car имеет значение null, сгенерировав исключение, тогда как при NOP мы вызываем методы для пустого объекта и продолжаем пыхтеть, пока не придет время отображаем объект, и в этот момент мы отфильтровываем пустые места. Кроме того, вам нужно знать значения, возвращаемые вашим пустым объектом. т.е. возвращает ли getColor() «нет» или «пусто».
Очевидно, должно быть что-то, что я упускаю из виду. Заранее спасибо.