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

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 に答える
0

sですべてを行うことができます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;
  }
}
于 2013-11-11T12:22:30.680 に答える