0

我有一个我想使用的遗留验证器类。它提供了所有排列来验证 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};
}

我对这门课没有任何影响。但必须使用这些检查器之一。

我想根据非空字段选择所需的验证器。因此,我编写了以下 switch 语句。但对我来说,这似乎很丑陋。我该如何改进呢?

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;
}
4

5 回答 5

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()]);
于 2013-11-11T12:01:26.320 回答
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()]);
于 2013-11-11T12:04:15.643 回答
1

您可以使用反射简化它,大致如下(实际上尚未编译,但应该足够接近):

String name = (a? "A":"") + (b? "B":"") + (c? "C":"");
checker = Validator.class.getField(name).get();
于 2013-11-11T11:54:47.790 回答
0

你可以用enums 做所有的事情。它添加了强大的可扩展性组件。

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;
  }
}
于 2013-11-11T12:22:30.680 回答
0

如果您真的想这样做,则必须将整个输入转换为“可区分大小写”的数据。例如整数

2 ^((int) a) * 3^((int) b) * 5^((int) c)

或字符串(从 java 7 开始)

但是,不要这样做。它很丑。创建一个集合并用必要的检查器填充它。正如克里斯·金所展示的

于 2013-11-11T12:11:55.860 回答