Это хороший код и использование опции 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() что полезно, когда вы не используете значение, за исключением передачи его другому объекту.

Другие вопросы по тегам