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;
}
}
我尝试使用泛型类型上的构建器模式创建 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;
}
}