Есть ли лучший способ сделать пустую проверку в 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;
Но я бы не стал делать это в серьезных проектах.