2016-06-09 24 views
1

Ich bin beschäftigt mit einem Projekt, das Daten aus einer XML-Datei extrahiert und in einem Word-Dokument anzeigt. Ich habe eine Methode für diese Extraktion erstellt, aber ich möchte es vereinfachen, indem Sie ein Array von Methoden verwenden. Diese ist nur ein Beispiel dafür, wie ich teste, bestimmte Informationen im Moment:Array von Set-Methoden - 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()); 
    } 
    } 
} 

Ich strebe ein Array für die if-Anweisung Werte, zum Beispiel „maximumRedeliveries“ und „asyncDelayedRedelivery“ zu schaffen und ein Array für die entsprechenden Methoden, zum Beispiel setMaximumRedeliveries(), setAsyncDelayedRedelivery(). Ich bin unsicher, wie ich eine Reihe von Methoden erstellen kann, oder ob es überhaupt möglich ist.

Dieses Problem unterscheidet sich von Java - Creating an array of methods, weil ich Set-Methoden verwenden und nicht wissen, wie Sie es auf diese Weise implementieren.

+4

Wenn Sie Java-8 verwenden, Sie Karte von String haben kann -> SomeInterface, mit SomeInterface mit 'Leere akzeptieren (Node node);' Methode und dann füllen Sie es mit Dingen wie 'map.put (" maximumRedeliveries ", this :: setMaximumRedeliveries);' Sagte, dass es viele XML-Processing-APIs gibt, die es auf wartungsfreundlichere Art und Weise tun können (indem sie Daten direkt in vom Schema erzeugte Pojos stellen) , in deine pojos, indem du dir erlaubst, Werte explizit abzufragen, anstatt auf sie zu reagieren, usw.) –

+0

Mögliches Duplikat von [Java - Ein Array von Methoden erstellen] (http://stackoverflow.com/questions/4280727/java-creating -an-array-of-methods) – MatheM

+0

@MatheM Ich t Ook ein Blick auf diese Frage, aber es funktionierte nicht ganz mit meiner Situation. – Hendrien

Antwort

1

zunächst sicher, dass extractPropertyName Namen mit und ohne geschweifte Klammern nimmt, und verhält sich wie folgt aus:

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

Dieses conditionals von XML-Verarbeitungscode in einen Helfer bewegt:

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 

Mit diesem Änderungen an Ort und Stelle, können Sie das Rezept von this other Q&A folgen und machen Sie eine Map<String,ValSetter> Objekte, wie folgt:

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);}}); 
} 

Jetzt konnte Ihre XML-Handler wie folgt aussehen:

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

Danke! Das hat funktioniert. – Hendrien