创建一个知道他的班级的对象

时间:2016-02-17 09:34:59

标签: java class inheritance

我想在枚举类上存储,所以稍后我可以实例化这个类。但我不知道如何做到这一点。

这是一个例子:

(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中这是怎么做的。

4 个答案:

答案 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();
}
}
相关问题