Java 创建了解其类的对象

Java 创建了解其类的对象,java,class,inheritance,Java,Class,Inheritance,我希望存储在枚举类上,以便以后可以实例化这个类。但我不知道我怎么能做到 这是一个例子: public enum STATE { MENU(Menu.class, Color bgColor); PLAY(Play.class, Color bgColor); ... public STATE() {... } } 以及具有在状态之间改变的方法。STATE上的所有类都继承自AState,例如(public class Menu扩展了AState{…}) 我的想法是使用一个枚举来保存每个

我希望存储在枚举类上,以便以后可以实例化这个类。但我不知道我怎么能做到

这是一个例子:

public enum STATE {
 MENU(Menu.class, Color bgColor);
 PLAY(Play.class, Color bgColor);
 ...
 public STATE() {...
 }
}
以及具有在状态之间改变的方法。STATE上的所有类都继承自AState,例如(
public class Menu扩展了AState{…}


我的想法是使用一个枚举来保存每个状态的类,以及一些参数来用不同的值(比如他的bgColor)实例化这个类,但我不知道在Java中如何做到这一点。

您不能通过构造函数初始化
enum
元素,这就是为什么
enum
构造函数可以是
private
或包保护的

上面的
public
构造函数将无法编译

要将
enum
值分配给引用,可以使用以下习惯用法:

STATE currentState = STATE.MENU;

你问题的答案在这里

Astate当前状态;
公共无效更改状态(状态s){
如果(currentState!=null)currentState.dispose();
构造函数ctor=s.clazz.getConstructor();
currentState=(Astate)ctor.newInstance();
currentState.init();
}

虽然我不知道是否有更好的方法来解决应用程序中的一般问题。

我建议在此枚举中使用抽象工厂方法

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();
    }
}
公共枚举状态{
菜单(菜单::新建),
PLAY(PLAY::new);
供应商和承包商;
州(供应商建造商){
stateConstructor=构造函数;
}
公共AState createInstance(){
return stateConstructor.get();
}
}
以下是示例代码

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 enum State {
    MENU(Menu::new),
    PLAY(Play::new);

    Supplier<AState> stateConstructor;

    State(Supplier<AState> constructor) {
        stateConstructor = constructor;
    }

    public AState createInstance() {
        return stateConstructor.get();
    }
}
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();
}
}