【问题标题】:Array of set methods - Java设置方法数组 - Java
【发布时间】:2016-10-10 04:38:00
【问题描述】:

我正忙于一个从 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 语句值创建一个数组,例如“maximumRedeliveries”和“asyncDelayedRedelivery”,并为它们的相应方法创建一个数组,例如 setMaximumRedeliveries()、setAsyncDelayedRedelivery()。我不确定如何创建方法数组,或者是否有可能?

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

【问题讨论】:

  • 如果你使用的是java 8,你可以有String->SomeInterface的map,SomeInterface有void accept(Node node);方法,然后用map.put("maximumRedeliveries", this::setMaximumRedeliveries);之类的东西填写,说,有很多XML 处理 API 可以以更可维护的方式完成(通过将数据直接放入从模式生成的 pojo 中,放入您的 pojo 中,允许您显式查询值而不是对它们做出反应等)
  • @MatheM 我看了一下那个问题,但它不太适合我的情况。
  • @ArturBiesiadowski 不幸的是我使用的是 java 7,但肯定会看看 XML 处理 API,谢谢。

标签: java arrays methods


【解决方案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&lt;String,ValSetter&gt; 对象,如下所示:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 2012-08-27
    • 2013-08-10
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多