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