Преимущество использования полей экземпляров в перечислимых классах заключается в том, что вы можете легко связать детали реализации с вашими константами, независимыми от вашего API.Другими словами, вы можете легко связать данные с вашими константами перечисления, которые допускали бы элегантное решение, с которым вы не женаты навсегда, в случае, например, если вам необходимо добавить новую константу перечисления.
Таким образом, вы можете значительно упростить вашу реализацию, выполнив тот же контракт следующим образом:
enum TrafficLightColor2 {
RED(2, 12),
GREEN(0, 10),
YELLOW(1, 2);
private int order; // implementation detail; non-exported
private int waitTime;
TrafficLightColor2(int ord, int waitTime) {
this.order = ord;
this.waitTime = waitTime;
}
int getWaitTime() {
return waitTime;
}
TrafficLightColor2 getNext() {
final int nextColor = (this.order + 1) % 3; // magic numbers introduce fragility
return Arrays.stream(TrafficLight2.values())
.filter(e -> e.order == nextColor)
.findAny()
.get();
}
}
Эта версия имеет некоторые преимущества по сравнению с вашей первоначальной реализацией: ее легче поддерживать, поскольку при добавлении констант enum компиляторзаставит вас добавить стоимость заказа.В оригинале, если вы забыли изменить свой блок if-else после добавления константы, ваша программа продолжит работать, но не будет обеспечивать правильное поведение.А поскольку реализация order
скрыта, вы можете в любое время удалить ее или изменить ее на другую реализацию, не влияя на правильность вашего API.