Метод enum переопределения
Я нашел Enum
s определяется следующим образом:
public Enum MyEnum {
ONE
{
@Override
public int getSomething() {
return 1;
}
},
TWO
{
@Override
public int getSomething() {
return 2;
}
}
int getSomething()
{
return 0;
}
}
как-то я чувствую некоторый дискомфорт с этой реализацией, потому что я думаю, что в идеале поле должно быть определено для этой цели, и класс должен выглядеть примерно так:
public Enum MyEnum{
ONE(1),
TWO(2)
private int theSomething;
private MyEnum(int something) {
theSomething = something;
}
int getSomething()
{
return theSomething;
}
}
проблема в том, что помимо личного дискомфорта я не могу найти никаких веских причин для изменения этого кода. Есть ли такие?
2 ответов
(перенесено из комментариев)
ваш первый пример обычно используется для реализации конечной машины в Java. Это устраняет необходимость в каждом методе, который должен иметь if (state == FOO) {} else if (state == BAR)
etc
class MyFSM {
enum State {
FIRST_STATE {
@Override
void start(MyFSM fsm) {
fsm.doStart();
}
@Override
void stop(MyFSM fsm) {
throw new IllegalStateException("Not Started!");
}
},
SECOND_STATE {
@Override
void start(MyFSM fsm) {
throw new IllegalStateException("Already Started!");
}
@Override
void stop(MyFSM fsm) {
fsm.doStop();
}
};
abstract void start(MyFSM fsm);
abstract void stop(MyFSM fsm);
}
private volatile State state = State.FIRST_STATE;
public synchronized void start() {
state.start(this);
}
private void doStart() {
state = SECOND_STATE;
}
public synchronized void stop() {
state.stop(this);
}
private void doStop() {
state = FIRST_STATE;
}
}
первый шаблон немного лучше для методов" по умолчанию", которые не все должны быть переопределены.
public enum Modes {
MODE_ONE {
@Override public boolean canDoA() {
return true;
}
},
MODE_TWO {
@Override public boolean canDoB() {
return true;
}
},
MODE_THREE {
@Override public boolean canDoC() {
return true;
}
};
public boolean canDoA() {
return false;
}
public boolean canDoB() {
return false;
}
public boolean canDoC() {
return false;
}
}