Java 将字符串与对象进行比较';动态调用s toString()方法
我在读一个文本文件,就像这样:Java 将字符串与对象进行比较';动态调用s toString()方法,java,object,command,Java,Object,Command,我在读一个文本文件,就像这样: 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 这部分工作正常,键和动作都是我想要的 gameKeys是
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
这部分工作正常,键
和动作
都是我想要的
gameKeys
是一个Map
声明如下:
private static Map<Keyboard.Key, Action> gameKeys = new HashMap<>();
因此,我试图将文件的组件转换为对象,比如如果键是空间和动作是开火动作,那么在执行添加方法后,游戏键将具有
还有什么我可以做的吗 您可以尝试以下方法:
- 将您的
操作
类保存在映射中您可以尝试以下操作:
- 将您的
操作
类保存在映射中您可以尝试以下操作:
- 将您的
操作
类保存在映射中您可以尝试以下操作:
- 将您的
操作
类保存在映射中确定
如果您有很多案例,您可以使用地图作为使用“如果”的替代方案当然
如果您有很多案例,您可以使用地图作为使用“如果”的替代方案当然
如果您有很多案例,您可以使用地图作为使用“如果”的替代方案当然
如果有很多情况,你不能直接实现你的要求,那么你可以使用Map作为使用if的替代方法,因为那样Java就必须创建它可以创建的所有类(有些类具有非默认构造函数,甚至是private),并调用它们的toString()方法(在一般情况下可能有副作用)
因此,无论如何,您必须创建包含所有操作的注册表(首选方式),或者您可以尝试在运行时使用反射来创建操作。您无法直接实现您的要求,因为这样Java就必须创建它可以创建的所有类(有些类具有非默认构造函数,甚至是私有的),并调用它们的toString()方法(一般情况下可能有副作用)
因此,无论如何,您必须创建包含所有操作的注册表(首选方式),或者您可以尝试在运行时使用反射来创建操作。您无法直接实现您的要求,因为这样Java就必须创建它可以创建的所有类(有些类具有非默认构造函数,甚至是私有的),并调用它们的toString()方法(一般情况下可能有副作用)
因此,无论如何,您必须创建包含所有操作的注册表(首选方式),或者您可以尝试在运行时使用反射来创建操作。您无法直接实现您的要求,因为这样Java就必须创建它可以创建的所有类(有些类具有非默认构造函数,甚至是私有的),并调用它们的toString()方法(一般情况下可能有副作用)
因此,无论如何,您必须创建包含所有操作的注册表(首选方式),或者您可以尝试在运行时使用反射来创建操作。这听起来很棒,但是(这是一个愚蠢的问题),我是否可以在操作
界面中声明映射,然后在实现操作的类中设置映射的值?@tetracomputerchure我建议创建一个映射,用于管理用户输入(例如,类ActionHandler
)。那么只有这个类知道操作
对象/键->操作绑定。@我编辑了我的答案,希望能澄清:)谢谢!我解决了大部分问题,但你帮了我很多!这听起来很棒,但是(这是一个有点愚蠢的问题),我会在操作
界面中声明映射,然后在实现操作的类中设置映射的值吗?@tetracomputerchure我建议创建一个映射,您可以在其中管理用户输入(例如,类操作处理程序
)。那么只有这个类知道操作
对象/键->操作绑定。@我编辑了我的答案,希望能澄清:)谢谢!我解决了大部分问题,但你帮了我很多!这听起来很棒,但是(这是一个有点愚蠢的问题),我会在操作
界面中声明映射,然后在实现操作的类中设置映射的值吗?@tetracomputerchure我建议创建一个映射,您可以在其中管理用户输入(例如,类操作处理程序
)。那么只有这个类知道操作
对象/键->操作绑定。@我编辑了我的答案,希望能澄清:)谢谢!我解决了大部分问题,但你帮了我很多!这听起来很棒,但是(这是一个有点愚蠢的问题),我会在操作
界面中声明映射,然后在实现操作的类中设置映射的值吗?@tetracomputerchure我建议创建一个映射,您可以在其中管理用户输入(例如,类操作处理程序
)。那么只有这个类知道操作
对象/键->操作绑定。@我编辑了我的答案,希望能澄清:)谢谢!我解决了大部分问题,但你帮了我很多!
public class FireAction implements Action {
@Override
public void execute() {
System.out.println("Fire key pressed!");
}
@Override
public String toString() {
return "FIRE_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());