当我尝试重构服务器时,我想到了这种情况,该服务器根据请求中是否存在某些文字来响应请求。下面的代码几乎概括了这一点。
if (request.contains("AAA")) {
send(SUCCESS_RESPONSE);
} else if (request.contains("BBB")) {
send(FAILURE_RESPONSE);
} ...
因此,我创建了一个response.properties 文件,其中包含可能的响应以及用于识别每个响应的 key :
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 文件仅包含来自 messages.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 原则。所以,我的问题是:
- 是否有更好的方法来使用此属性文件架构并确保属性文件的结构适合我的案例?
- 还有其他更优雅的方式来实现重构吗?
最佳答案
你的方法非常好,除了一个不需要的赋值行。你可以这样写:
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 - 如何确保属性文件中的值属于另一个属性文件的键集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35597646/