2016-06-09 40 views
1

我忙於從xml文件提取數據並將其顯示在word文檔中的項目。我爲這種提取創建了一種方法,但我想通過使用一組方法來簡化它。 這只是我如何測試目前某些信息的示例:設置方法數組 - 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()); 
    } 
    } 
} 

我的目標,以創建一個數組if語句值,例如「maximumRedeliveries」和「asyncDelayedRedelivery」和陣列它們的相應方法,例如setMaximumRedeliveries(),setAsyncDelayedRedelivery()。我不確定如何創建一組方法,或者甚至可能嗎?

此問題與Java - Creating an array of methods不同,因爲我使用set方法,不知道如何以這種方式實現它。

+4

如果您使用的是Java 8,你可以有字符串的地圖 - > SomeInterface,具有'空接受(節點節點)SomeInterface;'方法,然後用'map.put(「maximumRedeliveries」,this :: setMaximumRedeliveries)'填充它;'說有很多XML處理API可以以更可維護的方式實現它(將數據直接放入從模式生成的pojos中,進入你的pojos,允許你明確地查詢值而不是對它們作出反應等等) –

+0

[Java - Creating a array of methods]的可能的重複(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