Это хороший код и использование опции Java
Это хороший стиль кода и хорошее использование Option? Это не кажется правильным, потому что метод возвращает Generics, но тело не использует возвращение Generics. Кроме того, "пахнет" немного плохо из-за заявления IF.
public Optional<MyObjectType> readData() {
MyObjectType[] myArray = // Will not be null, but maybe Size 0.
if(myArray.length > 0)
return Optional.of(myArray[0]);
return Optional.of(null);
}
На стороне клиента у меня есть:
public void clientCode() {
Optional<CurrencyPointData> oData = readCurrency(Currency.ADA);
if(oData.isPresent()) {
CurrencyPointData data = oData.get();
// Use data object
}
}
Который также, кажется, не намного лучше, чем нормальный if(oData == null)
проверять.
Следовательно, этот код кажется мусором, поэтому я не должен использовать Optional??
3 ответа
Ваш код клиента демонстрирует цель Optional
,
Поощряет проверять код isPresent()
перед звонком get()
, выдвигая на первый план проблему, которая может не иметь никакой ценности, в отличие от простого использования CurrencyPointData
без Optional
где тогда не определено, может ли возвращаемое значение быть null
, Конечно, вы можете задокументировать, может ли метод вернуть null
, но это не очевидно в коде, и мы все знаем, что люди редко читают документацию подробно.
С Optional
Вы явно говорите, что значение может отсутствовать.
Вот почему Optional
лучше простого null
проверять.
Подумайте о том, чтобы не использовать Optional в остальной части кода с помощью orElse.
Кроме того, вы можете избежать "если" с помощью Option, это сделает ваш код чище.
public void clientCode() {
Optional<CurrencyPointData> oData = readCurrency(Currency.ADA);
CurrencyPointData data = oData.orElse(new CurrencyPointData(...));
}
Необязательный null - это плохо. использование Optional.empty()
,
Хотя Optional
заставляет вас обращаться null case
прежде чем вы сможете получить доступ к результату, нет смысла использовать isPresent()
, Использование null приведет к тому же коду, но без ненужной необязательной оболочки. Необязательно предлагает вам лучшие альтернативы "развернуть" результирующее значение.
Вы могли бы использовать orElse()
для значения по умолчанию в случае, если значение отсутствует.
С orElseGet()
Вы можете рассчитать альтернативную стоимость. Этот расчет выполняется только в случае пустого необязательного.
Или использовать orElseThrow()
указать, что операция без значения не может продолжаться.
Существует также ifPresent()
что полезно, когда вы не используете значение, за исключением передачи его другому объекту.