2014-10-28 74 views
0

我从一个文本文件中读取,像这样:比较字符串对象的toString()方法动态

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等 动作是一个接口,保持其他行动;那些动作具有返回动作的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()>

有反正我可以做到这一点?

回答

2

你可以试试这个:

  • 保存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; 
    } 

} 
+0

然而,这听起来很棒(这是一个愚蠢的问题),我会在'Action'接口中声明地图,然后在实现Action的类中设置地图的值? – Tetramputechture 2014-10-28 18:03:09

+0

@Tetramputechture我建议创建一个管理用户输入的地图(例如一个类ActionHandler)。然后只有这个类知道'Action'对象/键 - >动作绑定。 – ifloop 2014-10-28 18:06:35

+0

@Tetramputechture我编辑了我的答案,希望清除它:) – ifloop 2014-10-28 18:23:39

1

当然

Object keyObj = key, actionObj; 
if (key.equals("SPACE")) keyObj = Keyboard.Key.SPACE; 
if (action.equals("FIRE_ACTION")) actionObj = new FireAction()); 

您可以使用地图<字符串,...>作为替代,如果你有很多的情况下

0

你可以的,如果公司使用”没有实现你直接询问的东西 - 因为那么Java就不得不创建它可以创建的所有类(一些具有非默认的构造函数或者甚至是私有的),并且调用它们的toString()方法(这可能会产生副作用案件)。

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