这是我的问题。我目前有一个功能正常的路由调用的功能!但是,我想分析检查参数块。
让我解释一下。当用户输入URL以到达该功能时,他可以放置一些可选参数(总共6个)。至少需要其中一个参数才能继续。我的框架配置为为尚未被用户通知的参数分配空值。
要检查已通知哪些参数并验证它们,我有一个块:
public Result edit(String param1, String param2, String param3, String param4, String param5, String param6) {
Map<String, Object> parameters = new HashMap<>();
if (param1 != null) {
// Checking function depending on data type (URL, Boolean, ..), return a clean param or throw an InvalidParamException
// Variable param depends on type returned by checkParamType1
param = checkParamType1(param1);
parameters.put("param1", param);
}
if (param2 != null) {
param = checkParamType1(param2);
parameters.put("param2", param);
}
if (param3 != null) {
param = checkParamType2(param3);
parameters.put("param3", param);
}
if (param4 != null) {
param = checkParamType2(param4);
parameters.put("param4", param);
}
if (param5 != null) {
param = checkParamType3(param5);
parameters.put("param5", param);
}
if (param6 != null) {
param = checkParamType3(param6);
parameters.put("param6", param);
}
assert(parameters.size() > 0, "At least one parameter required");
// [TREATMENT]
}
我的问题是,在您看来,是否有可能将此区块分解?
我的项目在JAVA 8上运行。
谢谢:)
答案 0 :(得分:6)
你能做的最好的事情就是提取一个方法,并为你的自定义检查器使用方法参考。像这样:
private void checkAndAssign(Map<String, Object> map, String paramName, String paramValue, Function<String, Object> checker){
if(paramValue!=null){
Object param = checker.apply(paramValue);
map.put(paramName, param);
}
}
public Result edit(String param1, String param2, String param3, String param4, String param5, String param6) {
Map<String, Object> parameters = new HashMap<>();
checkAndAssign(map, "param1", param1, MyClass::checkParam1);
checkAndAssign(map, "param2", param2, MyClass::checkParam2);
checkAndAssign(map, "param3", param3, MyClass::checkParam3);
checkAndAssign(map, "param4", param4, MyClass::checkParam4);
checkAndAssign(map, "param5", param5, MyClass::checkParam5);
checkAndAssign(map, "param6", param6, MyClass::checkParam6);
assert(parameters.size() > 0, "At least one parameter required");
// [TREATMENT]
}
MyClass :: checkParam1是方法参考。编译器将允许您将此类引用替换为Function
等函数接口。
请参阅Java 8教程中的Method References。
答案 1 :(得分:2)
在Java 8中,您可以替换
if (param1 != null) {
param = checkParamType1(param1);
parameters.put("param1", param);
}
有类似的东西:
Optional.ofNullable(param1)
.ifPresent((param) -> parameters.put("param1", checkParamType1(param)));
答案 2 :(得分:0)
首先,您可以使用switch case语句。但在OO语言中,最好使用像责任链这样的设计模式......
答案 3 :(得分:0)
如果参数的数量不受限制,请尝试使用var-args参数并遍历生成的数组。
public Result edit(String... params) {
Map<String, Object> parameters = new HashMap<>();
IntStream.range(0, params.length).forEach(idx -> {
String param = params[idx];
if (param != null) {
Object p = checkParamType(param);
parameters.put("param" + idx, p);
}
});
}
答案 4 :(得分:-4)
java 8引入了一项新功能,以避免空值检查。看看:http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/