我正在阅读文本文件,如下:
while ((line = br.readLine()) != null) {
String[] a = line.split("\\: ");
key = a[0];
action = a[1];
gameKeys.add(key, action);
}
文件类似于
SPACE: FIRE_ACTION
E: USE_ACTION
此部分有效,key
和action
都是我想要的。
gameKeys
是Map
声明如下:
private static Map<Keyboard.Key, Action> gameKeys = new HashMap<>();
Keyboard.Key
包含SPACE
,A
,RETURN
等字段。
Action是一个接口,用于保存其他操作;这些操作使用toString()
方法返回操作,例如new FireAction.toString()
会返回FIRE_ACTION
。
行动示例:
public class FireAction implements Action {
@Override
public void execute() {
System.out.println("Fire key pressed!");
}
@Override
public String toString() {
return "FIRE_ACTION";
}
}
所以,我试图将文件的组件转换为对象,例如key
是"SPACE"
而action
是"FIRE_ACTION"
,然后,执行add
方法后,gameKeys
将<Keyboard.Key.SPACE, new FireAction()>
反正我能做到吗?
答案 0 :(得分:2)
你可以试试这个:
Action
课程保存在Map<String, Class<? extends Action>>
Action
对象
示例:
public class Main {
private static final Map<Keyboard.Key, Action> gameKeys = new HashMap<>();
private static final Map<String, Class<? extends Action>> actions = new HashMap<>();
static {
actions.put(FireAction.NAME, FireAction.class);
actions.put(WalkAction.NAME, WalkAction.class);
}
public static void main(String[] args) {
// read from file etc.
try {
// e.g. found SPACE : FIRE_ACTION
gameKeys.put(Keyboard.Key.SPACE, actions.get("FIRE_ACTION").newInstance());
// e.g. found A : WALK_ACTION
gameKeys.put(Keyboard.Key.A, actions.get("WALK_ACTION").newInstance());
} catch (IllegalAccessException | InstantiationException ex) {
ex.printStackTrace();
}
}
}
public class FireAction implements Action {
public static final String NAME = "FIRE_ACTION";
@Override
public void execute() {
System.out.println("Fire key pressed!");
}
@Override
public String toString() {
return NAME;
}
}
答案 1 :(得分:1)
不确定
Object keyObj = key, actionObj;
if (key.equals("SPACE")) keyObj = Keyboard.Key.SPACE;
if (action.equals("FIRE_ACTION")) actionObj = new FireAction());
您可以使用Map&lt; String,...&gt;作为替代使用'if's,如果你有很多案件
答案 2 :(得分:0)
你无法直接实现你所要求的 - 因为Java必须创建它可以创建的所有类(有些具有非默认构造函数甚至私有),并调用它们的toString()方法(一般情况下可能有副作用。)
因此,无论如何,您必须使用所有操作创建注册表(首选方式),或者您可以尝试使用反射在运行时创建操作。