在 Gosu 中使用枚举而不是 switch case

Using an enum instead of a switch case in Gosu

我想避免创建 switch case,而是使用 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) 视为 objectsclass 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;
    }
  }
}

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

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

如您所见 Gosu grammar 或以下 function 不允许出现在枚举常量中,甚至不允许出现常量之后的括号 {}

枚举正文中允许的内容:

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

所以基本上在 GOSU 枚举中包含 consts 并且通常像在任何其他 class 中一样休息