Проверка нулевых вложенных объектов - PullRequest
0 голосов
/ 11 июня 2018

Я знаю много способов, как проверить вложенные объекты на NullPointerException, а для Java 8 самое простое - применить Optional<param>.или использовать простой код if, такой как

if(foo.bar() != null && foo.getBar().getObject()!=null){
    foo.getBar().getObject().getWhatever();
}

. Мой вопрос в том, есть ли простой способ сделать это в одном методе, не зная имен внутренних классов / методов

длячтобы быть более понятным, у меня есть код, подобный этому

contract.getContactInfo().getPosition()
contract.getEntitledPerson().getEmail()

, и я хочу сделать что-то подобное для примера

excel.setCell(name1,contract.getContactInfo().getPosition());
excel.setCell(name2,contract.getEntitledPerson().getEmail());

, если его только для 2 вложенных объектов или только 2сеттеры это хорошо, но получить его за 50 ячеек Excel с иногда 5 или 6 вложенными объектами - это настоящий кошмар для этого

что-то вроде скажем, как метод setCell

public setCell(String name,Object object){
     return object; // make sure no nested object is null
}

я надеюсь, что мойвопрос достаточно понятен.Имейте в виду, я не могу просто изменить вложенные объекты, так как его старый код и используется во многих местах!есть идеи?

1 Ответ

0 голосов
/ 11 июня 2018

Как вы упомянули в этом вопросе, используйте Optional, но оно более длинное.

excel.setCell(name1, Optional.of(contract).map(Contract::getContactInfo).map(ContactInfo::getPosition).orElse(null));
excel.setCell(name2, Optional.of(contract).map(Contract::getEntitledPerson).map(Person::getEmail).orElse(null));

Который легче читать при форматировании следующим образом:

excel.setCell(name1, Optional.of(contract)
                             .map(Contract::getContactInfo)
                             .map(ContactInfo::getPosition)
                             .orElse(null));
excel.setCell(name2, Optional.of(contract)
                             .map(Contract::getEntitledPerson)
                             .map(Person::getEmail)
                             .orElse(null));

Есливаша цель - наименьший код, вы можете просто поймать NullPointerException.На мой взгляд, это что-то вроде хака, но сработает.

Сначала вспомогательный метод:

public static <T> T nullGuard(Supplier<T> supplier) {
    try {
        return supplier.get();
    } catch (@SuppressWarnings("unused") NullPointerException ignored) {
        return null;
    }
}

Затем вы упаковываете выражение, о котором идет речь:

excel.setCell(name1, nullGuard(() -> contract.getContactInfo().getPosition()));
excel.setCell(name2, nullGuard(() -> contract.getEntitledPerson().getEmail()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...