Цепочка геттеров и обработка исключений NullPointerExceptions
При выполнении цепочки геттеров для получения данных из вложенных объектов необходимо выполнять проверки на null чтобы избежать исключений NullPointerExceptions. При работе с несколькими уровнями объектов это может быстро стать многословным и неуклюжим.
Вложение операторов if
Один из распространенных подходов — вложение операторов if, проверяющих каждый объект в цепочка для нуля, прежде чем продолжить. Однако этот метод может стать громоздким и сложным в обслуживании.
Нарушение закона Деметры (LoD)
Этот подход нарушает закон Деметры (LoD) , в котором говорится, что методы должны вызывать другие методы только для объектов, на которые они ссылаются напрямую. Получая доступ к объектам за пределами их непосредственного контекста, этот метод нарушает инкапсуляцию задействованных классов.
Использование необязательного (Java 8)
К счастью, в Java 8 появился дополнительный класс , который обеспечивает более элегантный и типобезопасный способ обработки нулевых значений в цепочках геттеров. Необязательный представляет собой, возможно, нулевое значение и предоставляет методы для сопоставления и фильтрации содержащегося в нем значения. Необязательный.ofNullable() для первого объекта в цепочке. При этом создается дополнительный объект, который представляет значение или ноль. Затем вы можете связать операции map() для применения вызовов метода получения к значению, а необязательный будет автоматически обрабатывать проверки на нулевое значение. .map(дом -> house.getFloor(0)) .map(floorZero -> FloorZero.getWall(WEST)) .map(wallWest -> wallWest.getDoor()) .map(door -> Door.getDoorknob());
Безопасность и инкапсуляция
Этот подход не только упрощает код, но и обеспечивает безопасность типов. Класс Необязательный выдаст исключение, если вы попытаетесь получить доступ к значению, которое он представляет, без предварительной проверки, является ли оно нулевым. Кроме того, он поддерживает инкапсуляцию задействованных классов, поскольку вы получаете доступ только к методам непосредственно объектов, на которые ссылаетесь.
Optional doorknob = Optional.ofNullable(house)
.map(house -> house.getFloor(0))
.map(floorZero -> floorZero.getWall(WEST))
.map(wallWest -> wallWest.getDoor())
.map(door -> door.getDoorknob());
Хотя иногда может потребоваться нарушают LoD, обычно рекомендуется избегать чрезмерного вложения операторов if при объединении геттеров в цепочку. Вместо этого рассмотрите возможность использования класса Необязательный для более элегантной и типобезопасной обработки значений NULL.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3