如何根据3个变量编写switch语句?

时间:2013-11-11 11:50:15

标签: java permutation

我有一个与我合作的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;
}

5 个答案:

答案 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;
  }
}