2012-11-15 3 views
1

매개 변수의 입력에 따라 다른 메서드를 호출해야하는 응용 프로그램이 있습니다. 지금까지의 내 생각은 기본적으로 스위치를 만들고 그 방법으로 별도로 메서드를 호출한다는 것입니다. 예 :다른 메서드를 해당 매개 변수로 호출

How do I invoke a Java method when given the method name as a string?

을하지만 그때 나는 대답 중 하나에서 읽을 수는 있다고,이 질문에 규정 된

switch (methodName) 
{ 
    case "method1": 
     method1(); 
     break; 
    case "method2": 
     method2(); 
     break; 
    default: 
     System.out.println(methodName + " is not a valid method!"); 
} 

나는 그 주어진 문자열 메소드를 호출 할 수있는 옵션을 고려하고 안전하지 않음. 너희들은 어떻게 생각하니?

+3

상속 또는 구성을 사용해야합니다. –

+1

이 (비슷한) 질문을보십시오 : http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java – aioobe

+0

여러분, 고맙습니다. 내가 무엇을 검색해야하는지 확신 할 수 없다. (그러므로 나는 나의 질문에 대해 좋은 결과를 찾을 수 없었다). 내 생각에, 당신은 이미 내 질문을 닫을 수, 많이 감사합니다 :) –

답변

1

문자열에서 메서드 호출로 이동해야하는 경우 반사가 최상의 옵션 일 수 있습니다. 특히 호출 할 수있는 메서드 집합을 제한하는 경우에는 큰 안전 문제가 없습니다. Map<String, Method>을 사용하면 주 병목 현상이 반사 방식 호출이 아니므로 성능 향상이라는 이점을 얻을 수있는 방법 중 하나입니다. 그러나 메소드 조회가 필요합니다.

반영하지 않고 Map<String, Callable>으로 구현할 수 있습니다. Callable을 각 메서드 호출에 대해 익명 클래스 인스턴스로 구현합니다. 확실히 더 많은 상용구 코드가 있지만 "유형 안전".

+0

위대한! MethodCall은 어떻게 생겼을 까? 'Main.class.getMethod (command) .invoke (null)'? –

+0

'command'가 정적 메소드라면, 그게 전부입니다. 그렇지 않으면'null' 대신에 메소드를 호출 할 인스턴스를 사용하십시오. 예외 처리를 위해 여행하지 마라. try {... reflection ...} catch (RuntimeException e) {throw e; } catch (Exception e) {새로운 RuntimeException을 던지십시오 (e); }'. –

+0

그래도 문제가 있습니다.하지만 올바른 방향을 가리 킵니다. 최고의 답으로 표시했습니다! –

0

명령 디자인 패턴을 사용하여 리플렉션과 동일한 기능을 수행 할 수 있습니다. 액션을 객체로 래핑하므로 공통 인터페이스를 사용하여 조회하고 호출 할 수 있습니다.

자세히 알아보기 여기 : http://en.wikipedia.org/wiki/Command_pattern

+0

+1 멋진 제안입니다! –

관련 문제