2

我想避免创建一个开关盒,而是使用一个,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允许这样做吗?我应该如何实现这种行为?

4

2 回答 2

3

你误解了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()
于 2018-05-15T21:45:33.883 回答
2

正如您在 Gosu 语法或以下内容中所读到的,在function枚举 const 中是不允许的,即使是const{}之后的括号也是不允许的。

枚举正文中允许的内容:

enumBody = "{" [enumConstants] classMembers "}" .
enumConstants = enumConstant {"," enumConstant} [","] [";"] .
enumConstant = {annotation} id optionalArguments .

所以基本上在 GOSU 枚举中包含常量和休息,就像在任何其他类中一样。

于 2018-05-16T11:44:47.643 回答