Для тех, кого соблазнил здесь заголовок: да, вы можете определить свои собственные методы в своем перечислении. Если вам интересно, как вызвать такой нестатический метод, вы делаете это так же, как и с любым другим нестатическим методом - вы вызываете его для экземпляра типа, который определяет или наследует этот метод. В случае перечислений такие экземпляры просто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];
}
}