我想在枚举类上存储,所以稍后我可以实例化这个类。但我不知道如何做到这一点。
这是一个例子:
(1@@#%,2@@#%,3@@#%,4@@#%,5@@#%,6@@#%,65@@#%)
并且有一种改变状态的方法。 STATE上的所有类都继承自AState,例如(public enum STATE {
MENU(Menu.class, Color bgColor);
PLAY(Play.class, Color bgColor);
...
public STATE() {...
}
}
)
public class Menu extends AState{...}
我的想法是有一个包含每个状态的类的枚举,以及一些用不同的值来实例化这个类的参数,比如他的bgColor,但我不知道在Java中这是怎么做的。
答案 0 :(得分:3)
我建议在这个枚举中使用抽象工厂方法。
public enum State {
MENU {
public AState createInstance() { return new Menu();}
},
PLAY {
public AState createInstance() { return new Play();}
};
public abstract AState createInstance();
}
那么你可以这样做:
public void changeState(State s){
if(currentState != null) currentState.dispose();
currentState = s.createInstance();
}
我省略了色域,因为它不清楚它应该如何使用。如果每种状态的颜色相同,则可以将其作为额外的私有字段添加到枚举中。如果在构造新的AState
实例时使用各种颜色,则可以将其作为参数传递给createInstance()
方法。
如果你使用Java 8,这个枚举可以用更优雅的方式编写:
public enum State {
MENU(Menu::new),
PLAY(Play::new);
Supplier<AState> stateConstructor;
State(Supplier<AState> constructor) {
stateConstructor = constructor;
}
public AState createInstance() {
return stateConstructor.get();
}
}
答案 1 :(得分:0)
您无法通过其构造函数初始化enum
元素,这就是enum
构造函数可以是private
或受包保护的原因。
上面的public
构造函数将无法编译。
为了为引用分配enum
值,您可以使用以下习语:
STATE currentState = STATE.MENU;
答案 2 :(得分:0)
您的问题的答案在https://stackoverflow.com/a/6094602/1885467
Astate currentState;
public void changeState(STATE s){
if(currentState != null) currentState.dispose();
Constructor<?> ctor = s.clazz.getConstructor();
currentState = (Astate)ctor.newInstance();
currentState.init();
}
虽然我不知道是否有更好的方法来解决您的应用程序中的一般问题。
答案 3 :(得分:0)
以下是示例代码。
public enum SomeEnum {
MENU(SomeState.class, "This is menu");
private Class<? extends State> clazz;
private String value;
SomeEnum(final Class<? extends State> clazz, final String value){
this.clazz = clazz;
this.value = value;
}
public State getState() throws InstantiationException, IllegalAccessException{
State newInstance = clazz.newInstance();
newInstance.setSomeValue(value);
return newInstance;
}
}
public class SomeState implements State {
private String value;
@Override
public void runState() {
System.out.println("Running with value : " + value);
}
@Override
public void setSomeValue(String value) {
this.value = value;
}
}
public interface State {
void runState();
void setSomeValue(String value);
}
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
SomeEnum.MENU.getState().runState();
}
}