継承を使用してBuilderパターンを実装したいと思います。だから私は4つのクラスがあります:1つの抽象クラス(ClassA)、ClassB、ClassC。 TESTTESTクラスは、すべてこれがどのように動作するかを確認するために使用されます。Java:ビルダーパターン、継承、およびジェネリック
public abstract class ClassA {
private String aString;
public String getaString() {
return aString;
}
public abstract class ClassABuilder<T extends ClassABuilder>{
public T setaString(String str) {
ClassA.this.aString = str;
return (T)this;
}
public abstract ClassA build();
}
}
public class ClassB extends ClassA{
private String bString;
public String getbString() {
return bString;
}
public class ClassBBuilder<T extends ClassBBuilder> extends ClassA.ClassABuilder<T>{
public T setbString(String str) {
ClassB.this.bString = str;
return (T)this;
}
@Override
public ClassB build(){
return ClassB.this;
}
}
}
public class ClassC extends ClassB{
private String cString;
public String getcString() {
return cString;
}
public static ClassCBuilder<ClassCBuilder> newBuilder(){
return new ClassC().new ClassCBuilder();
}
public class ClassCBuilder<T extends ClassCBuilder> extends ClassB.ClassBBuilder<T>{
public T setcString(String str) {
ClassC.this.cString = str;
return (T)this;
}
@Override
public ClassC build(){
return ClassC.this;
}
}
}
public class TestTest {
public static void main(String[] args) {
// TODO code application logic here
ClassC C=ClassC.newBuilder()
.setaString(null)
.setbString(null)
.setcString(null) //LINE XXX
.build();
}
}
問題がTESTTESTでLINE XXXで、私はシンボル「setcString」を見つけることができない得るということです。何が間違っていますか?
ビルダーは静的である必要があります。そうでない場合は、ビルドしようとしているクラスのインスタンスを作成するために、ビルダーを作成するためにビルドするクラスのインスタンスが必要です。 –
@Andy Turner私はClassBにビルドメソッドを追加しませんでしたが、classCを参照してください - そのnewBuilderメソッドは静的です。 –
'ClassABuilder'は 'ClassABuilder >'でなければなりません。他のビルダーと同じです。 –