在Gosu中使用enum而不是switch case

时间:2018-05-10 15:50:39

标签: enums switch-statement gosu guidewire

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

正如你可以读到的那样 在enum consts中不允许Gosu grammarfunction以下,甚至在不允许使用consts之后使用方括号{}

枚举体中允许的内容:

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

所以基本上在GOSU中,enum包含consts并且通常像在任何其他类中一样休息。