#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
может заключаться не только в снижении производительности. Это также может быть проблемой, если:
doSomething
имеет побочные эффекты, например, если он вставляет строку в базу данных, и в этом случае при повторном вызове он вставит две строки.doSomething
зависит от некоторого внешнего состояния, которое может изменяться между вызовами.
Комментарии:
1. Да, я понимаю, иногда возвращаемый объект является строкой, и мне нужно проверить, что он не равен нулю, прежде чем я попытаюсь установить его в строку text = doSomething (), иначе я получу нулевой указатель, но я предполагаю, что в этом случае мне нужно возвращать «»; пустая строка, а затем проверка может быть (text.length() >0) Это нормальная практика?
2.
null
это вещь. Пустая строка-это другое дело. Зависит от того, чтоdoSomething
на самом деле… ну, делает. Если имеет смысл возвращать пустую строку, верните пустую строку (например, если метод возвращает строку между двумя индексами, и индексы совпадают). Если имеет смысл возвращать значение null, верните значение null. В любом случае aString
может быть нулевым, так что нет никаких проблем, если вы это сделаете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);