Đối với những người bị thu hút ở đây bằng tiêu đề: vâng, bạn có thể xác định các phương thức của riêng mình trong enum của bạn. Nếu bạn đang tự hỏi làm thế nào để gọi phương thức không tĩnh như vậy, bạn thực hiện theo cách tương tự như với bất kỳ phương thức không tĩnh nào khác - bạn gọi nó trên trường hợp của kiểu định nghĩa hoặc kế thừa phương thức đó. Trong trường hợp enums các trường hợp như vậy chỉ đơn giản là ENUM_CONSTANT
s.
Vì vậy, tất cả những gì bạn cần là EnumType.ENUM_CONSTANT.methodName(arguments)
.
Bây giờ chúng ta hãy quay lại vấn đề từ câu hỏi. Một trong những giải pháp có thể là
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;
}
}
Hiện nay Direction.NORTH.getOppositeDirection()
sẽ trở lại Direction.SOUTH
.
Đây là cách "hacky" hơn một chút để minh họa nhận xét @jedwards nhưng nó không linh hoạt như cách tiếp cận đầu tiên vì việc thêm nhiều trường hoặc thay đổi thứ tự của chúng sẽ phá vỡ mã của chúng ta.
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];
}
}