В случае, если вы не можете избежать нарушения Закона Деметры (LoD), как указано в выбранном ответе, и с Java 8, вводящей необязательный, вероятно, было бы лучшей практикой обрабатывать null в цепочках get, таких как ваша.
Тип Optional позволит вам выполнять несколько операций map (которые содержат вызовы get) подряд. Проверки Null выполняются автоматически под капотом.
Например, когда объекты не инициализированы, функция print() выполняться не будет и исключения выдаваться не будут. Со всем этим мы аккуратно справляемся под капотом. Когда объекты инициализированы, будет выполнена печать.
System.out.println("----- Not Initialized! -----");
Возврат будет чем-то вроде Optional<Door> что позволит вам гораздо безопаснее работать, не беспокоясь о null-исключениях.
Ответ 2
Чтобы проверить цепочку get на наличие null, вам может потребоваться вызвать свой код из замыкания. Код вызова замыкания будет выглядеть следующим образом:
Этот код также типобезопасен и в целом работает по назначению:
Возвращает фактическое значение указанного типа, если все объекты в цепочке не являются null.
Возвращает null, если какой-либо из объектов в цепочке является null.
Вы можете поместить метод opt в общий класс util и использовать его везде в своем приложении.
Ответ 3
Лучшим способом было бы избегать цепочки. Если вы не знакомы с Законом Деметры (LoD), на мой взгляд, вам следует. Вы привели прекрасный пример цепочки сообщений, которая слишком тесно связана с классами, о которых ей нечего знать.
Вы, конечно, могли бы просто обернуть все выражение в блок try-catch , но это плохая идея. Что-то более чистое - это шаблон Null object. При этом, если в вашем доме нет этажа 0, он просто возвращает этаж, который действует как обычный этаж, но не имеет реального содержимого; Этажи, когда их просят указать стены, которых у них нет, возвращают аналогичные "Нулевые" стены и т.д. В дальнейшем.