enum 알고 사용하자
enum
- 상수값을 모아서 관리하기
- 문자열이었다면 많은 예외처리를 해야할 수 있지만, 값의 범위를 강제해버리기떄문에 안전한 프로그래밍이 가능함
- 예를 들어 0 ~ 6까지 전달받아야하는데 래핑시켜서 그 값들만 받게끔 할 수 있음 : 유효성 체크 메소드 따로 만들지않고도
- 예시 2 : 방향 4가지만 줄 수 있도록 강제
/* example */
public enum Direction {
NORTH,
SOUTH,
EAST,
WEST;
}
public class Ladder {
public void move(Direction direction) {
}
}
- 클래스의 인스턴스 개수를 제한해버리고 만듦 : static 환경에서 만든다, 생성자가 private
- enum에 선언한 상수값들은 유일한 인스턴스
- 메모리 주소가 항상 같음 : 같은 값일 때, == 과 equals 동작이 같음
- 인스턴스라는 것을 기억하기 : 여기도 객체니깐 물어봐라
public enum Rank {
FIRST(6, 100000),
SECOND(5, 10000);
private int matchPoint;
private int winnerPrize;
Rank(int matchPoint) {
this.matchPoint = matchPoint;
}
public boolean isFirst() {
return FIRST == this;
}
/* 상태값을 그대로 리턴하는 get을 쓰지않고 이렇게 요청하는 방식으로 똑같이 할 수 있다 */
public int getTotalPrize(int matchCount) {
return this.winnerPrize * matchCount;
}
}
- 상태값이 변경되는 값을 enum에서 관리하면 안됨
- 유일한 인스턴스라서 멀티쓰레드 환경에서 위험함 : race condition 발생
- 고정되어있는 값만 관리하자 : final로 막기
public enum Rank {
private final int matchPoint;
private final int prize;
Rank(final int matchPoint, final int prize) {
this.matchPoint = matchPoint;
this.prize = prize;
}
}