枚举方法覆盖 [英] Enum method overriding

查看:109
本文介绍了枚举方法覆盖的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现 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 Enums 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆