我想避免创建开关盒,而是使用enum,但是在编写以下代码时,出现编译错误,提示unexpected token public

public enum Status {
  INACTIVE {
    public void doSomething() {
      //do something
    }
  },
  ACTIVE {
    public void doSomething() {
      //do something else
    }
  },
  UNKNOWN {
    public void doSomething() {
      //do something totally different
    }
  };

  public abstract void doSomething()
}


基本上,我要实现的目标与此类似:

public enum Status {
   ACTIVE,
   INACTIVE,
   UNKNOWN;
}

switch (getState()) {
  case INACTIVE:
    //do something
    break;
  case ACTIVE:
    //do something else
    break;
  case UNKNOWN:
    //do something totally different
    break;
}


Gosu允许这样做吗?我应该如何实现这种行为?

最佳答案

您已经误解了Enum的概念。首先,enum是从java.lang.Enum继承的。不允许将内部类实现为Enum constants。您必须将ACTIVE,INACTIVE和UNKNOWN(Enum constants)视为objects状态的class type
证明:
Status.ACTIVE.getClass() == class Status
Status.ACTIVE instanceof Status == true
Status.ACTIVE instanceof java.lang.Enum == true
如果要避免在主代码中使用switch语句,可以将switch移到enum的实现中,如下所示; (用Gosu编码)

enum Status {
  ACTIVE,INACTIVE,UNKNOWN;

  public function doSomething(){
    switch (this) {
      case INACTIVE:
         //do something
         break;
      case ACTIVE:
        //do something
        break;
      case UNKNOWN:
        //do something
        break;
    }
  }
}


现在,您可以从主代码中的doSomething()调用enum constants方法了
例:

var a=Status.ACTIVE
var b=Status.INACTIVE
var c=Status.UNKNOWN
a.doSomething()
b.doSomething()
c.doSomething()

08-08 01:08
查看更多