Java Enum 메서드 - 반대 방향 열거를 반환합니다.
반대 방향을 반환하는 메서드를 가진 열거형 디렉션을 선언하고 싶습니다(다음은 구문적으로 올바르지 않습니다. 즉, enum은 인스턴스화할 수 없지만 내 요점을 나타냅니다).자바에서도 가능합니까?
코드는 다음과 같습니다.
public enum Direction {
NORTH(1),
SOUTH(-1),
EAST(-2),
WEST(2);
Direction(int code){
this.code=code;
}
protected int code;
public int getCode() {
return this.code;
}
static Direction getOppositeDirection(Direction d){
return new Direction(d.getCode() * -1);
}
}
제목으로 유인된 사용자: 예, 열거형에서 고유한 메서드를 정의할 수 있습니다.이러한 비정적 메서드를 호출하는 방법이 궁금할 경우 다른 비정적 메서드와 마찬가지로 해당 메서드를 정의 또는 상속하는 유형의 인스턴스에서 호출합니다.enum의 경우, 이러한 예는 단순하다.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 코멘트를 설명하는 좀 더 "hacky"한 방법이 있지만 필드를 추가하거나 순서를 변경하면 코드가 깨지기 때문에 첫 번째 접근법만큼 유연하지 않습니다.
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];
}
}
이와 같은 작은 열거에 대해 가장 읽기 쉬운 해결책은 다음과 같습니다.
public enum Direction {
NORTH {
@Override
public Direction getOppositeDirection() {
return SOUTH;
}
},
SOUTH {
@Override
public Direction getOppositeDirection() {
return NORTH;
}
},
EAST {
@Override
public Direction getOppositeDirection() {
return WEST;
}
},
WEST {
@Override
public Direction getOppositeDirection() {
return EAST;
}
};
public abstract Direction getOppositeDirection();
}
이 방법은 다음과 같습니다.
public enum Direction {
NORTH, SOUTH, EAST, WEST;
public Direction oppose() {
switch(this) {
case NORTH: return SOUTH;
case SOUTH: return NORTH;
case EAST: return WEST;
case WEST: return EAST;
}
throw new RuntimeException("Case not implemented");
}
}
추상 메서드를 만들고 각 열거값이 이를 재정의하도록 합니다.작성할 때는 그 반대이기 때문에 동적으로 생성하거나 작성할 필요가 없습니다.
잘 읽히지 않는군요; 아마도switch
좀 더 쉽게 관리할 수 있을까요?
public enum Direction {
NORTH(1) {
@Override
public Direction getOppositeDirection() {
return Direction.SOUTH;
}
},
SOUTH(-1) {
@Override
public Direction getOppositeDirection() {
return Direction.NORTH;
}
},
EAST(-2) {
@Override
public Direction getOppositeDirection() {
return Direction.WEST;
}
},
WEST(2) {
@Override
public Direction getOppositeDirection() {
return Direction.EAST;
}
};
Direction(int code){
this.code=code;
}
protected int code;
public int getCode() {
return this.code;
}
public abstract Direction getOppositeDirection();
}
네, 우리는 항상 그것을 합니다.새 개체가 아닌 정적 인스턴스를 반환합니다.
static Direction getOppositeDirection(Direction d){
Direction result = null;
if (d != null){
int newCode = -d.getCode();
for (Direction direction : Direction.values()){
if (d.getCode() == newCode){
result = direction;
}
}
}
return result;
}
public enum Direction {
NORTH, EAST, SOUTH, WEST;
public Direction getOppositeDirection(){
return Direction.values()[(this.ordinal() + 2) % 4];
}
}
enums에는 소스 선언 순서대로 열거의 모든 값을 포함하는 배열을 반환하는 정적 값 메서드가 있습니다.
NORTH는 1, EAST는 2, SOUTH는 3, WEST는 4이므로 간단한 방정식을 작성하여 반대방정식을 얻을 수 있습니다.
(값 + 2) % 4
언급URL : https://stackoverflow.com/questions/18883646/java-enum-methods-return-opposite-direction-enum
'sourcecode' 카테고리의 다른 글
두 테이블 조건을 설정하여 한 테이블을 업데이트하는 방법 (0) | 2023.01.10 |
---|---|
와일드카드를 사용하여 디렉토리 내의 모든 파일에서 모듈을 Import할 수 있습니까? (0) | 2023.01.10 |
Stripe() 값이 잘못되었습니다.apiKey는 문자열이어야 합니다.지정한: 정의되지 않음 (0) | 2023.01.10 |
Spring Security를 사용하여 Java 코드에서 "hasRole"을 확인하는 방법 (0) | 2023.01.10 |
Java - SQL 주입을 방지하는 이스케이프 문자열 (0) | 2023.01.10 |