我有这个静态实用程序来验证pojo数据。
isValid = validateFunc1(pojo1);
isValid = validateFunc2(pojo1);
......
return isValid;
我可以说有多达10个验证器功能。
显然这不起作用,因为如果func1为false且func2为true,则覆盖布尔值。我的问题是,如果任何函数eval为false,我想返回false,否则返回true。
答案 0 :(得分:3)
每当你看到像这样的重复代码时,最好先问一下用循环或等效代码(例如流操作)替换一堆重复是否值得。这个案例是一个很好的候选人:
interface Validator {
boolean isValid(MyObject obj);
}
List<Validator> validators = getValidators();
return validators.stream().allMatch(v -> v.isValid(obj));
答案 1 :(得分:1)
使用&&
(and
)运算符。这个是短路的。这意味着如果左操作数被评估false
,那么右边的操作数将不被评估,被跳过。
return (validateFunc1(pojo1) && validateFunc2(pojo2));
假设您提供了大量布尔结果。使用循环并停止检查使其像短路一样。为简洁起见,我们首先定义函数数组并执行迭代。
// mock
boolean[] array = new boolean[] {true, true, true, true, false, false, true, true};
// iteration
boolean valid = true;
for (boolean b: array) {
if (!valid) { break; }
valid = valid && b;
}
我建议您逐个管理循环中可调用的方法。然后你不需要验证所有这些,因为其中一个已经失败。但是,您必须首先提供有关这些验证方法的信息。
个人建议:
例如,将静态方法转换为类NameValidated
,EmailValidated
......实现Validated
并将它们堆叠在要循环的数组中:
for (Validated validated: arrayOfValidated) {
if (!valid) { break; }
valid = valid && validated.get();
}
在静态方法上使用类有很多优点。如有兴趣,请阅读文章OOP Alternative to Utility Classes。我发现这是最干净的解决方案。
答案 2 :(得分:1)
使用&amp;&amp ;: return validateFunc1(pojo1) && validateFunc2(pojo1)
编辑:
您也可以这样做:
public interface Validator {
boolean validate(Pojo pojo);
}
public class ValidatorA implements Validator {
@Override
public boolean validate(Pojo pojo) {
...
}
}
public StaticUtilityClass {
private static final List<Validator> validators = ... ; // Add new ValidatorA(), new ValidatorB(), etc.
...
Pojo pojo = ...;
return validators.stream().allMatch(pojo::validate);
}
但这需要为每个验证器创建一个类。
答案 3 :(得分:0)
如果你想运行所有的验证器(因为它们正在记录,或者生成一个验证失败的列表以通知)并返回最终结果,那么
boolean valid = validateFunc1(pojo);
valid = validateFunc2(pojo) && valid;
[...]
valid = validateFuncN(pojo) && valid;
return valid;
答案 4 :(得分:0)
如果有很多功能,你可以将布尔值存储在一个arraylist中,然后迭代列表。如果列表中的布尔值在任何时候都为false,则返回false。如果它在列表上运行并且都不为false(全部为真),则返回true:
import java.util.ArrayList;
boolean isValid(){
ArrayList<Boolean> bool_list=new ArrayList<Boolean>();
bool_list.append(validateFunc1(pojo1));
bool_list.append(validateFunc2(pojo1));
...
for(int i=0; i<bool_list.size(); i++){
if(bool_list.get(i)==false){
return false;
}
}
return true;
}