考虑Web表面上的4个输入字段A,B,C和D.用户可以任意填写任何这些.如何填充这些字段有16种组合.允许的是:
A B C D ------- 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1
其中1表示不为null,0表示null.
我正在使用jsf的MVC模式.我不希望逻辑在视图中,而是在控制器中.在Java中检查这个的最佳方法是什么?
到目前为止,我实施了两个解
解决方案1:
@Override public boolean isInputInvalid(Integer a,Integer b,Integer c,Integer d) { if (isNotSet(a) && isNotSet(b) && isNotSet(c) && isNotSet(d) { return true; } return (firstParameterDoesNotExistAndSecondDoesExist(a,b)) || (firstParameterDoesNotExistAndSecondDoesExist(b,c)) || (firstParameterDoesNotExistAndSecondDoesExist(c,d)); } private boolean firstParameterDoesNotExistAndSecondDoesExist(Integer firstParameter,Integer secondParameter) { return isNotSet(firstParameter) && !isNotSet(secondParameter); } private boolean isNotSet(Integer parameter) { return parameter == null; }
解决方案2:
public boolean isInputValid(Integer a,Integer d) { if (exists(a) && !exists(b) && !exists(c) && !exists(d) || // exists(a) && exists(b) && !exists(c) && !exists(d) || // exists(a) && exists(b) && exists(c) && !exists(d) || // exists(a) && exists(b) && exists(c) && exists(d)) { return true; } return false; } private boolean exists(Integer level) { return level != null; }
注意:
第一种方法检查输入是否无效,而第二种方法检查输入是否有效(注意方法的名称).
我写了16个单元测试用例,两个版本都运行绿色.
解决方法
Valid combinations are: 1000,1100,1110 and 1111
如果您只关心可读性:
public static List<String> validOptions = Arrays.asList("1000","1100","1110","1111"); public boolean isValid(Integer a,Integer d) { StringBuilder sb = new StringBuilder(); sb.append(a==null ? 0 : 1); sb.append(b==null ? 0 : 1),sb.append(c==null ? 0 : 1); sb.append(d==null ? 0 : 1); return validOptions.contains(sb.toString()); }