Есть ли лучший способ сделать пустую проверку в Java?

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

Цель состоит в том, чтобы проверить значение логического поля, вложенного в два объекта.

private boolean sourceWebsite(Registration registration) {
    Application application = registration.getApplication();
    if (application == null) {
        return true;
    }

    Metadata metadata = application.getMetadata();
    if (metadata == null) {
        return true;
    }

    Boolean source = metadata.getSource();
    if (source == null) {
        return true;
    }

    return !source;
}

Я знаю, что это можно сделать за один if(). Я добавил несколько, if здесь для удобства чтения.

Есть ли способ, которым мы могли бы упростить приведенные выше операторы if и иметь простой служебный класс, который возвращает значение Boolean source если родительские объекты или нет, ноль?

Ответ 1

Вы можете использовать java.util.Optional следующим образом:

private boolean sourceWebsite(Registration registration) {
    return Optional.of(registration)
        .map(Registration::getApplication)
        .map(Application::getMetadata)
        .map(Metadata::getSource)
        .map(source -> !source)
        .orElse(Boolean.TRUE);
}

Короче говоря, это вернет true если любой из получателей вернет null, и !Metadata.source противном случае.

Ответ 2

Следующее вернет true, если любое из значений равно нулю. Если все значения не равны NULL, возвращается !source.

private boolean sourceWebsite(Registration registration) {
      return registration.getApplication() == null 
      ||     registration.getApplication().getMetadata() == null
      ||     registration.getApplication().getMetadata().getSource() == null
      ||    !registration.getApplication().getMetadata().getSource();

}

Обновлено:

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

private boolean sourceWebsite(Registration registration) {
      Application application;
      Metadata metadata;
      Source source;
      return (application = registration.getApplication()) == null 
      ||     (metadata = application.getMetadata()) == null
      ||     (source = metadata.getSource()) == null
      ||    !source;

 }

Ответ 3

Другой вариант, который вы можете использовать, это блок try-catch. Если вы получили исключение нулевого указателя, верните true.

private boolean sourceWebsite(Registration registration) {
    try {
        return !registration.getApplication().getMetadata().getSource();
    }
    catch (NullPointerException e) {
        return true;
    }
}

Ответ 4

Вы можете сделать это, используя такой хакерский метод:

public static Object get(Object o, String... m) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    if (o == null || m.length == 0) {
        return null;
    }
    for (String m1 : m) {
        o = o.getClass().getMethod(m1).invoke(o);
        if (o == null) {
            return null;
        }
    }
    return o;
}

И назовите это так:

Boolean source = (Boolean) get(registration, "getApplication", "getMetadata", "getSource");
return source == null ? false : !source;

Но я бы не стал делать это в серьезных проектах.