![](/img/trans.png)
[英]Does Arrays.toString() override Object's toString() method?
[英]Comparing a String to an Object's toString() method dynamically
我正在从一个文本文件中读取内容,如下所示:
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
等字段SPACE
是一个接口,用于保存其他操作; 这些动作具有返回动作的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()>
反正我能做到这一点吗?
您可以尝试以下方法:
Action
类保存在Map<String, Class<? extends 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;
}
}
当然
Object keyObj = key, actionObj;
if (key.equals("SPACE")) keyObj = Keyboard.Key.SPACE;
if (action.equals("FIRE_ACTION")) actionObj = new FireAction());
如果有很多情况,可以使用Map <String,...>作为使用'if'的替代方法
您无法直接实现所要求的内容-因为Java必须创建它可以创建的所有类(某些类具有非默认构造函数,甚至是私有的),然后调用其toString()方法(可能会有副作用)一般情况下)。
因此,无论如何,您都必须使用所有操作(最好的方式)创建注册表,或者您可以尝试使用反射在运行时中创建操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.