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();
}
}