2014-10-28 5 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이 필드가 등 SPACE, A, RETURN 같은 동작이다 다른 동작을 유지하는 인터페이스; 이러한 작업에는 작업을 반환하는 toString() 메서드가 있습니다. new FireAction.toString()FIRE_ACTION을 반환합니다. 액션의

예 : key 경우 "SPACE"action"FIRE_ACTION"이었다처럼 add 방법은, gameKeys 수행 된 후 그래서

public class FireAction implements Action { 

    @Override 
    public void execute() { 
     System.out.println("Fire key pressed!"); 
    } 

    @Override 
    public String toString() { 
     return "FIRE_ACTION"; 
    } 
} 

, 나는, 다음, 객체로 파일의 구성 요소를 설정하기 위해 노력하고있어 would have <Keyboard.Key.SPACE, new FireAction()>

어쨌든 나는 이것을 할 수 있습니까?

답변

2

이 작업을 시도 할 수 :

  • 가 키 예약비 Map<String, Class<? extends Action>>
  • 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

+0

@Tetramputechture 사용자 입력 (예 : 클래스 'ActionHandler')을 관리하는지도를 만드는 것이 좋습니다. 그런 다음이 클래스는'Action' 객체/Key -> Action 바인딩에 대해 알고 있습니다. – ifloop

+0

@Tetramputechture 나는 나의 대답을 편집했다, 그것을 깨끗하게하는 희망 : – ifloop

1

물론

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

당신은지도 < 문자열을 사용할 수 있습니다 ...>의 경우 경우

0

당신이 할 수있는 많은 경우 '사용에 대한 대안으로 당신이 직접적으로 물어 본 결과를 얻지 못한다. Java는 생성 ​​할 수있는 모든 클래스를 생성해야하고 (일부는 기본 생성자가 아니거나 심지어 private 일 수도있다), toString() 메소드를 호출해야한다. (일반적으로 부작용이있을 수있다. 케이스).

어쨌든 모든 작업 (선호 방법)으로 레지스트리를 만들어야하거나, 리플렉션을 사용하여 런타임에 작업을 만들려고 할 수 있습니다.