繁体   English   中英

动态将字符串与对象的toString()方法进行比较

[英]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

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

gameKeys是这样声明的Map

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

Keyboard.Key具有诸如SPACEARETURN等字段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>>
  • 从文件中读取Key-> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM