我有一个与我合作的lecagy验证员课程。它给出了所有排列以验证1-3个不同的字段。
class Validator {
Checker Validator.A, Validator.B, Validator.C;
Checker[] ABC = {Validator.A, Validator.B, Validator.C};
Checker[] AB = {Validator.A, Validator.B};
Checker[] BC = {Validator.B, Validator.C};
Checker[] AC = {Validator.A, Validator.C};
}
我对这门课没有任何影响。但必须使用其中一个Checkers。
我想根据非空的字段选择所需的验证器。 因此,我写了以下开关状态。但对我来说,它似乎非常难看。我怎么能改善这个?
String a, b, c;
boolean isA = !a.isEmpty();
boolean isB = !b.isEmpty();
boolean isC = !c.isEmpty();
Checker[] checker;
if (isA && isB && isC) {
checker = Validator.ABC;
} else if (isA && isB) {
checker = Validator.AB;
} else if (isA && isC) {
checker = Validator.AC;
} else if (isB && isC) {
checker = Validator.BC;
} else if (isA) {
checker = Validator.A;
} else if (isB) {
checker = Validator.B;
} else if (isC) {
checker = Validator.C;
}
答案 0 :(得分:4)
这个怎么样?
List<Checker> checkers = new ArrayList<Checker>();
if (!a.isEmpty()) checkers.add(Validator.A);
if (!b.isEmpty()) checkers.add(Validator.B);
if (!c.isEmpty()) checkers.add(Validator.C);
Checker[] checker = checkers.toArray(new Checker[checkers.size()]);
答案 1 :(得分:2)
或者你也可以这样做
List<Checker> list = new ArrayList<>();
if (!a.isEmpty()) {
list.add(Validator.A);
}
if (!b.isEmpty()) {
list.add(Validator.B);
}
if (!c.isEmpty()) {
list.add(Validator.C);
}
Checker[] checker = list.toArray(new Checker[list.size()]);
答案 2 :(得分:1)
你可以使用反射来简化它,大概是这样的(实际上没有编译,但应该足够接近):
String name = (a? "A":"") + (b? "B":"") + (c? "C":"");
checker = Validator.class.getField(name).get();
答案 3 :(得分:0)
如果你真的想要这样做,你必须将整个输入转换为“case'able”数据。例如int
2 ^((int) a) * 3^((int) b) * 5^((int) c)
或字符串(自java 7起)
但是,不要这样做。它很丑。创建一个集合并用必要的检查器填充它。如Chris King所示
答案 4 :(得分:0)
你可以用enum
来完成整个事情。它增加了一个强大的可扩展性组件。
enum Checker {
A, B, C;
public boolean check () {
// You do this.
return true;
}
}
enum Validator{
ABC(Checker.A, Checker.B, Checker.C),
AB(Checker.A, Checker.B),
BC(Checker.B, Checker.C),
AC(Checker.A, Checker.C),
A(Checker.A),
B(Checker.B),
C(Checker.C),
;
final Checker[] checkers;
Validator(Checker ... checkers) {
this.checkers = checkers;
}
boolean validate(Collection a, Collection b, Collection c) {
// Grow the name of the validator from the data.
String name = (!a.isEmpty()?"A":"") +
(!b.isEmpty()?"B":"") +
(!c.isEmpty()?"C":"");
// The final result.
boolean checksOut = true;
// TODO: Handle the all-empty scenario.
if ( name.length() > 0 ) {
// Pull the checks array out of the correct validator.
Checker [] checks = Validator.valueOf(name).checkers;
for ( Checker check : checks ) {
// Do all of the checks defined.
checksOut &= check.check();
}
}
return checksOut;
}
}