여기 제목으로 유혹하는 사람들을 위해 : 예, 열거 형에서 자신 만의 메서드를 정의 할 수 있습니다. 이러한 비 정적 메서드를 호출하는 방법이 궁금하다면 다른 비 정적 메서드와 동일한 방식으로 수행합니다. 해당 메서드를 정의하거나 상속하는 유형의 인스턴스에서 호출합니다. 열거 형의 경우 이러한 인스턴스는 단순히 ENUM_CONSTANT
s입니다.
따라서 필요한 것은 EnumType.ENUM_CONSTANT.methodName(arguments)
.
이제 질문에서 문제로 돌아 갑시다. 해결책 중 하나는
public enum Direction {
NORTH, SOUTH, EAST, WEST;
private Direction opposite;
static {
NORTH.opposite = SOUTH;
SOUTH.opposite = NORTH;
EAST.opposite = WEST;
WEST.opposite = EAST;
}
public Direction getOppositeDirection() {
return opposite;
}
}
지금 Direction.NORTH.getOppositeDirection()
반환 Direction.SOUTH
됩니다.
@jedwards 주석 을 설명하는 좀 더 "해키"방식이 있지만 필드를 더 추가하거나 순서를 변경하면 코드가 깨지기 때문에 첫 번째 접근 방식만큼 유연하지 않습니다.
public enum Direction {
NORTH, EAST, SOUTH, WEST;
// cached values to avoid recreating such array each time method is called
private static final Direction[] VALUES = values();
public Direction getOppositeDirection() {
return VALUES[(ordinal() + 2) % 4];
}
}