动态地将String与Object的toString()方法进行比较

时间:2014-10-28 17:47:45

标签: 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

此部分有效,keyaction都是我想要的。

gameKeysMap声明如下:

private static Map<Keyboard.Key, Action> gameKeys = new HashMap<>();

Keyboard.Key包含SPACEARETURN等字段。 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()>

反正我能做到吗?

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

  • Action课程保存在Map<String, Class<? extends Action>>
  • 阅读密钥 - &gt;来自文件的动作绑定
  • 通过地图
  • 将字符串操作解析为实际的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()方法(一般情况下可能有副作用。)

因此,无论如何,您必须使用所有操作创建注册表(首选方式),或者您可以尝试使用反射在运行时创建操作。