枚举方法覆盖 [英] Enum method overriding
问题描述
我发现 Enum
的定义如下:
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;
}
}
问题是除了个人不适之外我找不到任何好的理由改变这段代码。是否存在?
(从注释中移除)
第一个例子通常用于实现Java中的有限状态机。它消除了每个方法必须有 if(state == FOO){} else if(state == BAR)
etc
>
class MyFSM {
枚举状态{
FIRST_STATE {
@Override
void start 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.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;
}
}
I've found Enum
s defined like the following:
public Enum MyEnum {
ONE
{
@Override
public int getSomething() {
return 1;
}
},
TWO
{
@Override
public int getSomething() {
return 2;
}
}
int getSomething()
{
return 0;
}
}
Somehow I feel some type of discomfort with this implementation because I would think that ideally a field should be defined for this purpose and the class should look something like:
public Enum MyEnum{
ONE(1),
TWO(2)
private int theSomething;
private MyEnum(int something) {
theSomething = something;
}
int getSomething()
{
return theSomething;
}
}
The problem is that apart from personal discomfort I cannot find any good reason to change this code. Do any exists?
(moved from comment)
Your first example is used commonly to implement a finite state machine in Java. It eliminates the need for every method having to have a 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;
}
}
这篇关于枚举方法覆盖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!