设置方法的数组 - Java

时间:2016-06-09 13:30:00

标签: java arrays methods

我正忙于从xml文件中提取数据并将其显示在word文档中的项目。我已经为这个提取创建了一个方法,但是我希望通过使用一组方法来简化它。 这只是我目前如何测试某些信息的一个例子:

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语句值创建一个数组,例如&#34; maximumRedeliveries&#34;和&#34; asyncDelayedRedelivery&#34;以及相应方法的数组,例如setMaximumRedeliveries(),setAsyncDelayedRedelivery()。我不确定如何创建一系列方法,或者它是否可能?

此问题与Java - Creating an array of methods不同,因为我使用了set方法,并且不知道如何以这种方式实现它。

1 个答案:

答案 0 :(得分: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
}