Optional.ofNullable보다 Optional.of를 사용하는 이유는 무엇입니까?


232

Java 8 Optional클래스를 사용하는 경우 선택 사항으로 값을 랩핑 할 수있는 두 가지 방법이 있습니다.

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

Optional.ofNullable을 사용하는 유일한 안전한 방법이라는 것을 알고 Optional있지만 왜 Optional.of존재합니까? 왜 Optional.ofNullable 항상 안전하고 안전한 곳에 서 있지 않습니까?


1
이것을 사용하기 위해 어떤 패키지를 가져와야하는지 알려주십시오.
LoveToCode

4
@LoveToCode java.util.Optional-JDK 8 이상을 사용하는 경우 사용 가능
whirlwin

11
그들이했을 경우 나는 사랑 ofNullable()의 이름 of()과 및 of()이름ofNotNull()
로버트 니스트 로지를


"Optional.of가 존재하는 이유는 무엇입니까? Optional.ofNullable 만 사용하고 항상 안전한 곳에있는 이유는 무엇입니까?" 사용자의 필수 데이터가 존재하지 않으면 예외를 던져야한다고 가정 해 봅시다. 따라서 사용 사례에 따라 다릅니다. baeldung.com/java-optional-throw-exception
Karan Arora

답변:


306

귀하의 질문은 던질 수 NullPointerException있는 코드가 그렇지 않은 코드보다 나쁘다는 가정에 근거합니다 . 이 가정은 잘못되었습니다. foobar프로그램 논리로 인해 null이 아닌 것으로 예상되면 프로그램에 버그가 있음을 나타내는 것이 표시 Optional.of(foobar)되므로 사용 하는 것이 훨씬 좋습니다 NullPointerException. 사용 Optional.ofNullable(foobar)하고 버그 foobarnull인해 발생 하는 경우 프로그램이 자동으로 잘못 작동하여 더 큰 재앙이 될 수 있습니다. 이렇게하면 나중에 오류가 발생할 수 있으며 오류가 발생한 시점을 이해하기가 훨씬 더 어려워집니다.


129
" 프로그램 로직으로 인해 foobar가 null이 아닌 것으로 예상되는 경우Optional.of(foobar) " 를 사용하는 것이 훨씬 좋습니다 . 우리 null는 어떤 경우에도 가치가 없을 것이라는 것을 알면 왜 그 자체로 값을 감싸지 않고 값 자체를 사용하지 Optional않습니까?
Konstantin Yovkov

54
@ kocko, Optional구현중인 인터페이스에 따라 메소드에서 를 반환해야 할 수도 있습니다 (아마도 다른 구현자는 빈 옵션을 반환 할 수 있습니다). 또는 선택 사항의 모음 / 스트림을 만들려고합니다. 그 중 일부는 null이 아닌 것으로 보장되고 일부는 그렇지 않습니다. 또는 여러 분기에서 선택 사항을 만드는 조건부 논리가 있으며 단일 분기에서는 null이 아닌 것으로 확신합니다.
Tagir Valeev

28
선택 사항은 존재하거나 부재 할 수 있음을 의미합니다. 결석! = null. null이 경우 "foobar가 존재할 것으로 예상하지만 버그로 인해 null"입니다. Optional.isPresent() == falsefoobar가 존재하지 않음을 의미합니다. 즉 이것은 합법적 인 행동입니다.
Buurman

43
@kocko는 : 간단한 예 : return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));list포함되지 않습니다 것으로 예상된다 null... 값을
홀거

5
@Harish 당신이 나에게 묻는다면, 나는 모든 곳에서 옵션을 사용하지 않는 것이 좋습니다. 그것은 별도의 질문입니다. 여기에서 몇 가지 의견을 확인할 수 있습니다 .
Tagir Valeev

12

또한 객체가 null 인 경우 코드가 작동하지 않아야한다는 것을 알고 있으면 다음을 사용하여 예외를 throw 할 수 있습니다 Optional.orElseThrow

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);

1
그러나이를 위해 더 짧은 것을 사용할 수 있습니다String name = Objects.requireNonNull(nullName);
Holger

1
좋은 점 @Holger, 그러나 .orElse () 메서드는 제어 흐름이나 정보 로깅을보다 잘 처리하는 데 도움이되는 사용자 지정 예외를 허용합니다.
Nikos Stais

1
추가 정보를 제공하기 위해 예외에 대한 메시지를 제공 할 수 있습니다. NullPointerException문제가 명확 null하지 않은 참조 인 경우와 다른 예외를 사용하는 것과 같은 다른 사용자 정의 시도 는 잘못된 방향으로 나아가는 단계입니다.
Holger

또한 선택적을 사용하여 NPE가 아닌보다 구체적인 (예 : 사용자 지정) 예외를 발생시킬 수 있습니다. NPE가 너무 일반적이므로 다음과 같은 항목을 던질 수 있습니다.new NullNameException("meaningful msg")
Dáve

1

시나리오에 따라 다릅니다.

비즈니스 기능이 있고 그 가치가있는 것을 더 처리해야하지만 null처리시 가치가있는 것이 가치가 있다고 가정 해 봅시다 .

그런 경우을 사용할 수 있습니다 Optional<?>.

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");

0

어쨌든 서비스 결과에는 주로 옵션을 사용해야합니다. 서비스에서 당신이 가지고있는 것을 알고 결과가 있으면 Optional.of (someValue)를 반환하고 그렇지 않으면 Optional.empty ()를 반환하십시오. 이 경우 일부 값은 null이 아니어야하며 여전히 Optional을 반환합니다.


1
편집 Sumesh에 감사하지만 마지막 행에서 "someValue"로 편집 한 "someValue"는 위의 "Optional.of (someValue)"의 변수를 참조하며 someValue를 유지해야합니다.
espendennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.