Java 具有构建器模式的泛型类型 DSL

Java Generics Type DSL with Builder Pattern

我尝试使用泛型类型上的构建器模式创建 DSL Java API。

我有以下 class:

public class Rule<T> {

  private Predicate<T> condition;

  public ConditionBuilder<T> when() {
    return new ConditionBuilder<>(this);
  }

  //setter and getter 

}

和以下 ConditionBuilder class:

public class ConditionBuilder<T> {

  private Rule<T> parent;

  public ConditionBuilder(Rule<T> parent) {
    this.parent = parent;
  }

  public ConditionBuilder<T> condition1() {
    parent.setCondition(l -> l == 0); // I would like an Integer
    return this;
  }

  public ConditionBuilder<T> condition2() {
    parent.setCondition(l -> l.length() > 3); // I would like a String
    return this;
  }

}

我试图找到一个解决方案,将 Generic Type 动态设置为 condition1(resp.condition2)的 Integer(resp.String)。

是否有任何模式或解决方案可以避免进行 instanceof 检查?

您不能使用 ConditionBuilder<T> 上的成员方法执行此操作,因为您在调用任一 conditionX 方法之前已经构造了 parent。因此,您不能约束实例 "after the fact".

我这样做的方法是使 Rule<T> 成为静态方法的参数。然后你可以使用类似的东西:

static ConditionBuilder<Integer> condition1(ConditionBuilder<Integer> parent) {
  parent.setCondition(l -> l == 0);
  return parent;
}

static ConditionBuilder<String> condition2(ConditionBuilder<String> parent) {
  parent.setCondition(l -> l.length() > 3);
  return parent;
}

我会改用工厂模式,因为构建器模式不适合这种情况。使用泛型意味着您将接受任何类型,因此让 condition 要求特定类型是对泛型的浪费。

public class Rule<T> {
  private Predicate<T> condition;
  //setter and getter
}

class ConditionFactory {
  public static Rule<Integer> intCondition() {
    Rule<Integer> rule = new Rule<>();
    rule.setCondition(l -> l == 0);
    return rule;
  }

  public static Rule<String> strCondition() {
    Rule<Integer> rule = new Rule<>();
    rule.setCondition(l -> l.length() > 3);
    return rule;
  }
}