더북(TheBook)

1.6 스위치 실패 피하기

class BoardComputer {

    CruiseControl cruiseControl;

    void authorize(User user) {
        Objects.requireNonNull(user);
        switch (user.getRank()) {
            case UNKNOWN:
                cruiseControl.logUnauthorizedAccessAttempt();
            case ASTRONAUT:
                cruiseControl.grantAccess(user);
                break;
            case COMMANDER:
                cruiseControl.grantAccess(user);
                cruiseControl.grantAdminAccess(user);
                break;
        }
    }
}

지난 수년 간 수많은 버그의 원인으로 악명을 떨친 프로그래밍 언어 구조체가 여러 개 있습니다. 그 중 하나가 switch입니다. 스위치를 쓸 때는 주의하는 것이 좋습니다.

위 코드의 authorizeUser()는 매개변수를 검증하고 null 참조를 확인합니다. 자바 API에 있는 편리한 매개변수 검증 방법인 Objects.requireNonNull()을 사용해 입력이 널이면 예외를 발생시킵니다. 하지만 authorizeUser()에는 스위치 실패(switch fallthrough)라는 고전적인 버그가 남아 있습니다.