我们有这个学校项目,我们应该在这里租用类似汽车的Java应用程序。
我写了下面的代码,它只需要一些jsonObject属性,根据动作代码调用函数,并将一些东西放在jsonObject属性中。但我真的不喜欢这种代码重复模式...
if(action.equals("REGOPR")) {
// Register operator
String user = (String)jsonObject.get("username");
String pass = (String)jsonObject.get("password");
if(registerOperator(user, pass))
jsonObj.put("resp", "Operator successfully registered!");
else {
jsonObj.put("status", "fail");
jsonObj.put("resp", "Username already taken!");
}
} else if (action.equals("ADDVEH")) {
// Add vehicle
String manuf = (String)jsonObject.get("manufacturer");
String regis = (String)jsonObject.get("registration");
String licen =((String)jsonObject.get("license"));
if(addVehicle(manuf, regis, licen))
jsonObj.put("resp", "Successfully added vehicle!");
else {
jsonObj.put("status", "fail");
jsonObj.put("resp", "Vehicle alredy exists!");
}
} And fifteeen more else ifs with different "actions"...
我想做的是这样的事情
if(action.equals("REGOPR")){
awesomeMethod(registerOperator,
"Custom succesffull message",
"Fail message",
"username",
"password");
} else if(action.equals("ADDVEH")) {
awesomeMethod(addVehicle,
"Custom succesfull message 2",
"Fail message 2",
"manufacturer",
"registration",
"license");
}
最后任意数量的字符串,每个字符串应该从json中获取值,然后将其输入到给定的函数中。
答案 0 :(得分:3)
由于方法签名不兼容(不要试图改变这些签名),你必须装入一个数组:
private void awesomeMethod(Predicate<String[]> func, String failMessage,
String succesMessage, String...arr) {
String[] args = new String[arr.length];
for(int i = 0; i < args.length; i++)
args[i] = (String) jsonObject.get(arr[i]);
if(func.test(args)) {
jsonObj.put("resp", succesMessage);
} else {
jsonObj.put("status", "fail");
jsonObj.put("resp", failMessage);
}
}
然后,在调用时,您必须将数组位置映射到参数:
awesomeMethod(arr -> addVehicle(arr[0], arr[1], arr[2]),
"Custom succesfull message 2",
"Fail message 2",
"manufacturer",
"registration",
"license");
如果您只有几个参数数量不同的方法,您还可以考虑为每个参数数量设置重载。这将避免数组装箱,并使调用更简单。
您还可以使用地图删除if语句。