我想避免创建开关盒,而是使用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()