Я хотел бы объявить перечисление Direction, которое имеет метод, возвращающий противоположное направление (следующее синтаксически неверно, т. Е. Перечисления не могут быть созданы, но это иллюстрирует мою точку зрения). Возможно ли это в Java?
Вот код:
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);
}
}
java
enums
enumeration
Скайлер
источник
источник
d.getCode() * -1
==-d.getCode()
Ответы:
Для тех, кого соблазнил здесь заголовок: да, вы можете определить свои собственные методы в своем перечислении. Если вам интересно, как вызвать такой нестатический метод, вы делаете это так же, как и с любым другим нестатическим методом - вы вызываете его для экземпляра типа, который определяет или наследует этот метод. В случае перечислений такие экземпляры просто
ENUM_CONSTANT
s.Так что все, что вам нужно, это
EnumType.ENUM_CONSTANT.methodName(arguments)
.Теперь вернемся к проблеме из вопроса. Одним из решений может быть
Сейчас
Direction.NORTH.getOppositeDirection()
вернусьDirection.SOUTH
.Вот немного более «хитрый» способ проиллюстрировать комментарий @jedwards, но он не кажется таким гибким, как первый подход, поскольку добавление дополнительных полей или изменение их порядка нарушит наш код.
источник
.values()[ordinal()]
хакер, но этот подход намного надежнееDirection
класса перечисленийNORTH
,EAST
,SOUTH
,WEST
так что вы можете просто использовать ,NORTH.getOppositeDirection()
и он вернетсяSOUTH
. «Как называется эта техника? » - если вы спрашиваете,static{...}
то это статический блок инициализации , это код, вызываемый при первой загрузке класса (это часть того же процесса, который инициализирует статические поля).Для такого небольшого перечисления я считаю наиболее удобочитаемым решением:
источник
Это работает:
источник
Создайте абстрактный метод и пусть каждое из значений перечисления переопределяет его. Поскольку вы знаете обратное, пока создаете его, нет необходимости динамически генерировать или создавать его.
Однако он не очень хорошо читается; возможно,
switch
было бы более управляемым?источник
Да, мы делаем это постоянно. Вы возвращаете статический экземпляр, а не новый объект
источник
Перечисления имеют метод статических значений, который возвращает массив, содержащий все значения перечисления в порядке их объявления. источник
так как СЕВЕР получает 1, ВОСТОК получает 2, ЮГ получает 3, ЗАПАД получает 4; вы можете составить простое уравнение, чтобы получить противоположное:
(значение + 2)% 4
источник