在Java中,是否可以创建一个可扩展的类层次结构,其方法是流畅的并且可以以任何顺序调用?是的!请参见下面的答案,即使对于现有的类,当您无法访问源代码时,只要方法是流畅的,也可以提供此功能!
我正在改装一个现有的层次结构,并希望使用工厂或至少是通用构造函数和(最终)不可变的生成器模式(JB P.14)。设置字段的方法返回void - 最好让它们返回通用的T - 这样我们将获得执行方法链接的能力(它们现在都调用super)。
目标:
1. 避免在每个类中创建静态getFactory()方法。 2. 简单的方法签名。 3. 创建一个通用的工厂方法,但会在编译时捕获问题。 4. 在发生错误时获得编译时错误而不是运行时错误。
根据要求,非通用代码非常简单,但不起作用。
我正在改装一个现有的层次结构,并希望使用工厂或至少是通用构造函数和(最终)不可变的生成器模式(JB P.14)。设置字段的方法返回void - 最好让它们返回通用的T - 这样我们将获得执行方法链接的能力(它们现在都调用super)。
目标:
1. 避免在每个类中创建静态getFactory()方法。 2. 简单的方法签名。 3. 创建一个通用的工厂方法,但会在编译时捕获问题。 4. 在发生错误时获得编译时错误而不是运行时错误。
根据要求,非通用代码非常简单,但不起作用。
public class A {
private String a = null;
protected A setA(String a){
this.a = a;
return this;//<== DESIRE THIS TO BE CHAINABLE
}
protected static A factory(){
return new A();
}
}
.
public class B extends A {
private String b = null;
protected Foo setB(String b){
this.b = b;
return this;//<== DESIRE THIS TO BE CHAINABLE
}
protected static B factory(){
return new B();
}
}
现在,调用者可以尝试调用B.factory().setA("a").setB("b")//无法编译
但是这样不能编译,因为setA()
返回的是A
而不是B
。你可以通过覆盖B
中的setA()
方法,调用setB()
并返回B
而不是A
来使其工作。避免为每个方法委托是关键。我只想要一个可扩展的链式类方法组,可以以任何顺序调用。B.getFactory().B("b").A("a")
显然可以工作。