2016-06-09 4 views
1

XML 파일에서 데이터를 추출하여 워드 문서로 표시하는 프로젝트에 많은 시간을 할애하고 있습니다. 이 추출 방법을 만들었지 만 일련의 방법을 사용하여 단순화하고 싶습니다. 이 나는 ​​순간에 특정 정보에 대한 테스트 방법의 단지 예입니다set 메소드의 배열 - Java

for (int i = 0; i < nodeMap.getLength(); i++) { 
    Node node = nodeMap.item(i); 
if (node.getNodeName().equalsIgnoreCase("maximumRedeliveries")) { 

    if (node.getNodeValue().startsWith("{{")) { 
     retryLogic.setMaximumRedeliveries(extractPropertyName(node.getNodeValue(), propFileLocation)); 
    } else { 
     retryLogic.setMaximumRedeliveries(node.getNodeValue()); 
    } 
} 
if (node.getNodeName().equalsIgnoreCase("asyncDelayedRedelivery")) { 

    if (node.getNodeValue().startsWith("{{")) { 
     retryLogic.setAsyncDelayedRedelivery(extractPropertyName(node.getNodeValue(), propFileLocation)); 
    } else { 
     retryLogic.setAsyncDelayedRedelivery(node.getNodeValue()); 
    } 
    } 
} 

나는에 대한 배열을 생성하는 것을 목표로하고있는 경우 문 값, 예를 들어 "maximumRedeliveries"와 "asyncDelayedRedelivery"및 배열에 대한 해당 메소드 (예 : setMaximumRedeliveries(), setAsyncDelayedRedelivery()). 메소드의 배열을 만드는 방법이 확실하지 않거나 심지어 가능하다면?

이 문제는 양식을 사용하고 그 방법으로 구현하는 방법을 모르므로 양식 Java - Creating an array of methods과 다릅니다.

+4

당신은 자바 (8)를 사용하는 경우, 당신은 문자열의지도 할 수 있습니다 -> SomeInterface을 SomeInterface은'무효 동의 (노드 노드) 갖는 한 후 '방법을 'map.put ("maximumRedeliveries", this :: setMaximumRedeliveries);와 같은 것으로 채 웁니다. 더 유지 보수가 용이 한 방법으로 XML 처리 API를 사용할 수 있습니다 (스키마에서 생성 된 pojos에 직접 데이터를 넣음으로써 , 당신의 pojos에, 그들에게 반응하는 대신 명시 적으로 값을 쿼리 할 수있게함으로써 등) –

+0

가능한 복제본 [Java - 메소드 배열 만들기] (http://stackoverflow.com/questions/4280727/java-creating -an-array-of-methods) – MatheM

+0

@MatheM I t 그 질문을 보아라. 그러나 그것은 나의 상황과 아주 맞지 않았다. – Hendrien

답변

1

먼저, extractPropertyName 함께 중괄호없이 이름을 소요,이 같은 동작하는지 확인하십시오

String extractOptionalPropertyName(String name, String propFileLocation) { 
    return name..startsWith("{{") ? extractPropertyName(name, propFileLocation) : name; 
} 

이 도우미로 XML 처리 코드에서 조건문을 이동 : 다음으로

String nodeName = node.getNodeName(); 
if (nodeName.equalsIgnoreCase("maximumRedeliveries")) { 
    retryLogic.setMaximumRedeliveries(extractOptionalPropertyName(node.getNodeValue(), propFileLocation)); 
} else if (nodeName.equalsIgnoreCase("asyncDelayedRedelivery")) { 
    retryLogic.setAsyncDelayedRedelivery(extractOptionalPropertyName(node.getNodeValue(), propFileLocation)); 
} ... // and so on 

장소가 바뀌면 this other Q&A의 요리법을 따라 다음과 같이 Map<String,ValSetter> 개체를 만듭니다.

interface ValSetter { 
    void set(RetryLogic logic, String val); 
} 
// The map can be made static in a class 
Map<String,ValSetter> setterForName = new HashMap<>(); 
{ // Initializer block 
    setterForName.put("maximumredeliveries", new ValSetter() {public void set(RetryLogic logic, String val) { logic.setMaximumRedeliveries(val);}}); 
    setterForName.put("asyncrelayedredelivery", new ValSetter() {public void set(RetryLogic logic, String val) { logic.setAsyncDelayedRedelivery(val);}}); 
} 
,

이제 XML 처리기는 다음과 같이 수 :

String nodeName = node.getNodeName(); 
ValSetter setter = setterForName.get(nodeName.toLowerCase()); 
if (setter != null) { 
    String val = extractOptionalPropertyName(node.getNodeValue(), propFileLocation); 
    setter.set(retryLogic, val); 
} else { 
    // report an error 
} 
+0

고마워요! 그게 효과가 있었어. – Hendrien