【问题标题】:How to assure that the values in a properties file belong to the keyset of another properties file?如何确保属性文件中的值属于另一个属性文件的键集?
【发布时间】:2016-06-06 11:26:42
【问题描述】:

我在尝试重构服务器时想到了这种情况,该服务器根据请求中是否存在某些文字来响应请求。下面的代码几乎概括了它。

if (request.contains("AAA")) {
    send(SUCCESS_RESPONSE);
} else if (request.contains("BBB")) {
    send(FAILURE_RESPONSE);
} ...

因此,我创建了一个responses.properties 文件,其中包含可能的响应以及用于识别每个响应的密钥:

SUCCESS_RESPONSE=<here there is a big successful response>
FAILURE_RESPONSE=<here there is a smaller failure response>
...

还有一个 requests.properties 文件,其中包含要在请求中查找的文字以及遇到密钥时服务器将发送的响应:

AAA=SUCCESS_RESPONSE
BBB=FAILURE_RESPONSE
...

我的服务器端代码被重构为:

ResourceBundle responses = ResourceBundle.getBundle("responses");
ResourceBundle requests = ResourceBundle.getBundle("requests);
...
for (String requestKey : requests.keySet()) {
    if (clientRequest.contains(requestKey)) {
        send(responses.getString(requests.getString(requestKey)));
        break;
    }
}

这绝对比最初的更优雅。

但令我困扰的是,现在您必须确保 requests.properties 文件仅包含来自responses.properties 文件的键集的值。

我写了一个检查这个的方法:

private static boolean resourceBundlesAreWellStructured() {
    Set<String> responseKeys = responses.keySet();
    for (String requestKey : requests.keySet()) {
        String requestValue = requests.getString(requestKey);
        if (!responseKeys.contains(requestValue)) {
            return false;
        }
    }
    return true;
}

但我觉得我这样违反了 DRY 原则。所以,我的问题是:

  1. 是否有更好的方法来使用此属性文件架构并确保属性文件的结构适合我的情况?
  2. 还有其他更优雅的方式来实现重构吗?

【问题讨论】:

    标签: java resourcebundle properties-file


    【解决方案1】:

    你的方法很好,除了一个不需要的赋值行。你可以这样写:

    private static boolean resourceBundlesAreWellStructured() {
        for (String requestKey : requests.keySet()) {
            String requestValue = requests.getString(requestKey);
            if (!responses.containsKey(requestValue)) {
                return false;
            }
        }
        return true;
    }
    

    如果你使用 Java 8,你可以用 stream() 写同样的东西:

    private static boolean resourceBundlesAreWellStructured() {
        return requests.keySet().stream().noneMatch(
            key->!responses.containsKey(requests.getString(key))
        );
    }
    

    【讨论】:

    • 谢谢肯!是的,Java 8 有一些很棒的特性,但我不得不为这个项目坚持使用 Java 7...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2012-03-24
    • 2013-02-05
    相关资源
    最近更新 更多