Как проверить, возвращает ли метод java значение null без необходимости запускать его дважды

#java

Вопрос:

У меня много раз была такая ситуация в моем коде,

У меня есть метод, например, такой как:

 private Object doSomething(){
//Do something
doSomething ? return Object : return null;
}

 

Это всего лишь пример, затем в основной части моего кода мне нужно проверить, не возвращает ли это значение null, прежде чем я сделаю что-то еще. Например:

 if(doSomething() != null){

Object object = doSomething();
 

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

Есть ли способ разработать этот код, при котором этот двойной запуск не обязательно должен иметь место. Принимая во внимание, что проверка правильности объекта важна в коде.

Комментарии:

1. Переверни его. Сначала назначьте результат object , а затем проверьте, является ли object он нулевым.

2. Как насчет сохранения результата doSomething() в переменной ?

Ответ №1:

Просто поверните процесс вспять. Сначала назначьте результат этого вызова переменной, а затем проверьте, является ли эта переменная null .

 Object object = doSomething();
if (object != null) {
    // do whatever with object
} else {
    // do something else
}
 

Стоит отметить, что проблема с несколькими вызовами doSomething может заключаться не только в снижении производительности. Это также может быть проблемой, если:

  1. doSomething имеет побочные эффекты, например, если он вставляет строку в базу данных, и в этом случае при повторном вызове он вставит две строки.
  2. doSomething зависит от некоторого внешнего состояния, которое может изменяться между вызовами.

Комментарии:

1. Да, я понимаю, иногда возвращаемый объект является строкой, и мне нужно проверить, что он не равен нулю, прежде чем я попытаюсь установить его в строку text = doSomething (), иначе я получу нулевой указатель, но я предполагаю, что в этом случае мне нужно возвращать «»; пустая строка, а затем проверка может быть (text.length() >0) Это нормальная практика?

2. null это вещь. Пустая строка-это другое дело. Зависит от того, что doSomething на самом деле… ну, делает. Если имеет смысл возвращать пустую строку, верните пустую строку (например, если метод возвращает строку между двумя индексами, и индексы совпадают). Если имеет смысл возвращать значение null, верните значение null. В любом случае a String может быть нулевым, так что нет никаких проблем, если вы это сделаете String str = doSomething(); if (str == null)........

Ответ №2:

Рассмотрите возможность использования необязательного, а не возврата null (введено в Java 8).

 public Optional<Object> doSomething() {
  return Optional.ofNullable(someData);
}
 

При вызове у вас есть необязательная ссылка, которая может содержать (или не содержать) содержимое.

 Optional<Object> maybeSomething = doSomething();
if (maybeSomething.isPresent()) {
  Object someData = maybeSomething.get();
  System.out.println("SomeData = " someData);
}
 

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

 Optional<Object> maybeSomething = doSomething();
maybeSomething.ifPresent(someData ->  System.out.println("SomeData = "   someData);
 

или, если вам не нужно больше работать с someData вами, вы могли бы даже сделать

 doSomething().ifPresent(someData -> System.out.println("SomeData = "   someData);