반응형
Java 8에서 Optional을 사용할 때 주의해야 할 사항과 관련된 예제 소스
1. 리턴값으로만 쓰기를 권장한다
메소드의 매개변수 타입, 맵의 키 타입, 인스턴스 필드 타입으로 사용하지 않는 것이 좋습니다.
// 권장되지 않는 사용 예
public void process(Optional<String> input) {
// ...
}
// 권장되는 사용 예
public Optional<String> process() {
// ...
}
2. Optional을 리턴하는 메소드에서 null을 리턴하지 말자
Optional을 반환하는 메소드에서는 절대로 null을 반환하지 않도록 합니다.
// 잘못된 사용 예
public Optional<String> getValue() {
return null; // 절대 이렇게 하지 말 것
}
// 올바른 사용 예
public Optional<String> getValue() {
return Optional.ofNullable(null); // null일 경우 빈 Optional을 반환
}
3. 프리미티브 타입용 Optional이 따로 있다
프리미티브 타입을 위한 OptionalInt, OptionalLong 등을 사용합니다. (성능, 명확한 의도 표현)
// Optional 사용 예
public OptionalInt getOptionalInt() {
int value = ...;
return (value != -1) ? OptionalInt.of(value) : OptionalInt.empty();
}
- OptionalInt, OptionalLong, ...
4. Collection, Map, Stream, Array, Optional을 Optional로 감싸지 말 것
Collection, Map, Stream, Array, Optional 타입을 다시 Optional로 감싸지 않도록 합니다.
// 잘못된 사용 예
public Optional<Optional<String>> getOptionalValue() {
Optional<String> value = Optional.of("test");
return Optional.of(value); // 이런 중첩은 피할 것
}
// 올바른 사용 예
public Optional<String> getOptionalValue() {
return Optional.of("test");
}
종합 예제
위의 주의사항을 종합하여 하나의 클래스 예제로 보여드리겠습니다.
import java.util.Optional;
import java.util.OptionalInt;
public class OptionalExample {
// 리턴값으로만 Optional 사용
public Optional<String> findValue() {
String value = null; // 비어있을 수 있는 값
return Optional.ofNullable(value);
}
// null을 리턴하지 말고 Optional.empty() 사용
public Optional<String> getValue() {
String value = null;
return (value != null) ? Optional.of(value) : Optional.empty();
}
// 프리미티브 타입용 Optional 사용
public OptionalInt findOptionalInt() {
int value = -1; // 기본값
return (value != -1) ? OptionalInt.of(value) : OptionalInt.empty();
}
// Collection, Map, Stream, Array, Optional 타입을 Optional로 감싸지 말 것
public Optional<String> getNestedOptional() {
return Optional.of("test");
}
public static void main(String[] args) {
OptionalExample example = new OptionalExample();
// findValue 메서드 사용
example.findValue().ifPresent(System.out::println);
// getValue 메서드 사용
example.getValue().ifPresent(System.out::println);
// findOptionalInt 메서드 사용
example.findOptionalInt().ifPresent(System.out::println);
// getNestedOptional 메서드 사용
example.getNestedOptional().ifPresent(System.out::println);
}
}
이 예제 코드는 Optional을 올바르게 사용하는 방법을 보여줍니다. 메서드는 Optional을 리턴하지만, 메서드 매개변수나 클래스 필드로는 사용하지 않습니다. 또한 Optional을 리턴할 때 null을 리턴하지 않고, 프리미티브 타입용 Optional을 사용하며, 중첩 Optional을 사용하지 않습니다.
반응형
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[java8] 인터페이스의 디폴트 메서드, 스태틱 메서드 (0) | 2024.06.14 |
---|---|
[Java8] Optional 사용 방법과 예시 (0) | 2024.06.12 |
[Java] 가변객체, 불변객체 (1) | 2023.03.30 |
[Java] String, StringBuilder, StringBuffer 차이점 (0) | 2023.03.30 |
[JAVA] StringBuilder 메서드 별 간단한 사용 예제 (0) | 2023.03.29 |