Должен ли Optional.ofNullable () использоваться для проверки на ноль? - PullRequest
0 голосов
/ 27 августа 2018

Какой нуль-чек предпочтительнее?

Optional.ofNullable(port).ifPresent(settings::setPort);

или

if (port != null) {
   settings.setPort(port);
}

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Несмотря на то, что фрагмент, который вы разместили в этом вопросе, является простым способом избежать уродливого null-check, он все же действителен, корректен и безопасен. Следуйте вашим личным предпочтениям в этом случае.

Реальная сила Optional - это следующие методы:

В качестве примера предположим, что вы хотите получить другое значение из port, чтобы добавить его в список и избежать NPE, если port равно null:

Optional.ofNullable(port).map(port::getSomeValue).ifPresent(settings::setPort);

Кроме того, пожалуйста, избегайте следующей бессмысленной замены null-check Я часто вижу:

if (Optional.ofNullable(port).isPresent()) {
    settings.setPort(port);
}
0 голосов
/ 28 августа 2018

В Java значение Optional представляет собой объединение бита, который указывает на наличие или отсутствие, со значением произвольного ссылочного типа T или примитива int, long или double.

Слияние их особенно полезно при возврате значения из метода, поскольку методы имеют только одно возвращаемое значение. Часто необходимо использовать специальное значение, такое как null в случае ссылочных типов или -1 в случае int, в качестве часового для указания случая "без значения". Использование Optional в качестве возвращаемого значения позволяет избежать проблемы, связанной с тем, что вызывающий абонент случайно использует значение часового в качестве реального возвращаемого значения.

Учитывая это, строка кода, такая как

Optional.ofNullable(port).ifPresent(settings::setPort);

странно тем, что объединяет значение с текущим / отсутствующим битом в первой части строки, а затем сразу же разделяет их во второй части строки. Это добавляет сложности к тому, что в конечном итоге является довольно простой задачей: проверить, является ли port ненулевым, и условно выполнить некоторое действие. Фрагмент альтернативного кода:

if (port != null) {
    settings.setPort(port);
}

достаточно ясно выражает, что именно делает.

Это правда, что оператор if занимает больше вертикального пространства, чем цепочка Optional. Цепочка Optional плотнее, но ее также сложнее понять: плохой компромисс.

0 голосов
/ 27 августа 2018

Это зависит от нескольких факторов, когда использовать это. Если port является свойством в классе, вероятно, использование Optional немного излишне. (и не используйте Optional s как свойство, поскольку они не serializbie )

Я думаю, Optional отлично, например, при написании библиотеки.

public Optional<Integer> getPort()

гораздо более наглядно для других разработчиков, чем

// Returns null if not set
public Integer getPort()
...