kok202
Java Optional class

2019. 4. 25. 14:23[개발] 기록

Java 에서 가장 골치덩어리였던게 null point exception. 대부분의 에러는 NullPointException에서 나는 경우가 많다. 그래서 개발자들은 null을 처리해주기 위해서 if (myObject == null) 과같이 조건문을 만들고 분기를 태워줘야 했었다. 이렇게 처리된 코드는 보기도 흉했고 가독성도 떨어졌고, null 처리 로직이 들어가는 것 자체가 코드를 길게 하는 요인이였다. 이러한 문제 때문에 클린 코드에서는 가능하면 메소드가 null 을 리턴하지 말도록 권장했다. 클린 코드는 차라리 null 값보다 Empty 객체를 리턴하라고 말한다.

https://kok202.tistory.com/25?category=785883

 

[2019.02.09] 클린코드 (오류, 경계)

오류 if문에 의한 오류처리를 피해라. try catch finally를 이용해라. try catch finally는 일종의 트랜잭션처럼 여겨야한다. try 에서 뭔짓을 하던 오류가나면 catch에서 롤백해줘야한다, 미확인 예외 처리를 안..

kok202.tistory.com

 

 

 

java.util.Optional 은 이러한 문제를 해결함과 동시에 클린코드에서 말한 권장사항도 동시에 지킬 수 있는 굉장히 유용한 솔루션인다.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    private int id = -1;
    private String name = "[Nothing]";
}
public class Main{
    private ArrayList<Member> members;

    public static void main(String[] args){
        Main main = new Main();
        Member memberA = main.findMember(0).orElse(new Member());
        Member memberB = main.findMember(1).orElse(new Member());
        Member memberC = main.findMember(2).orElse(new Member());
        Member memberD = main.findMember(3).orElse(new Member());
        System.out.println(memberA);
        System.out.println(memberB);
        System.out.println(memberC);
        System.out.println(memberD);
    }

    public Main(){
        members = new ArrayList<Member>();
        members.add(new Member(0,"kok202"));
        members.add(new Member(1,"brandon"));
        members.add(new Member(2,"testMember"));
    }

    public Optional<Member> findMember(int id){
        for(Member member : members){
            if(member.getId() == id)
                return Optional.of(member);
        }
        return Optional.empty();
    }
}

 

결과 

Member(id=0, name=kok202)
Member(id=1, name=brandon)
Member(id=2, name=testMember)
Member(id=-1, name=[Nothing])

 

Optional.orElse 메소드를 통해 메소드가 empty optional 을 리턴받을 경우 에대한 로직을 처리해줄 수 있다. 위의 경우 빈객체를 받아오도록했다. 이외에도 Optional.orElseThrow로 empty optional 을 리턴받을 경우 Exception을 던질 수 있다.

 

참고 : Swift (ios 프로그래밍 언어) 에서는 nil 을 사용하여 참조하고 있는 객체가 null 이 될 수 있음을 나타냈다.