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