Java 8에서 불변 객체와 제한된 상태를 모델링합니다.
enum은 가능한 상태를 컴파일 단계에서 제한합니다. 불변 값 객체는 필드를 private final로 두고 생성자에서 검증하며 값을 바꾸는 setter를 제공하지 않습니다.
println(course)는 Course가 재정의한 toString을 호출하고, 그 안에서 level을 이어 붙일 때 enum 상수의 이름 BEGINNER가 쓰여 Java (BEGINNER)가 출력됩니다. 클래스 선언의 final은 하위 클래스가 상속으로 동작을 바꾸는 길을 막습니다. 다만 생성자는 title만 검사하므로 level에 null을 넘기면 그대로 저장되어 Java (null)이 출력됩니다.
값 객체가 컬렉션처럼 변경 가능한 객체를 받는다면 방어적 복사도 필요합니다. final은 참조 교체를 막을 뿐 참조 대상 내부 변경까지 막지는 않습니다.
문자열 상태보다 enum을 사용하면 오타와 허용되지 않은 상태를 줄일 수 있습니다.
getter로 변경 가능한 내부 객체를 그대로 반환하면 불변성이 깨질 수 있습니다.
직접 바꿔보세요durationMinutes final 필드를 추가하고 생성자에서 양수인지 검증하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.