2016-04-19 16 views
0

Builderデザインパターンを使用して、サブクラスのジェネリックタイプに基づいて親オブジェクトのサブクラスを作成しています。その文は一種の混乱で、ここで私が何を意味するかです:親の汎用ビルダーを使用してサブクラスを作成する

public class Animal(){ 
    private String name; 
    private String gender; 

    public Animal(Builder<?> builder){ 
     this.name = builder.name; 
     this.gender = builder.gender; 
    } 

    public static Builder<T extends Animal>{ 
     private String name; 
     private String gender; 

     public Builder<T> setName(String name){ 
      this.name = name; 
      return this; 
     } 

     public Builder<T> setGender(String gender){ 
      this.gender = gender; 
      return this; 
     }   

     public T build(Class<T> clazz){ 
      try { 
       Constructor<T> c = clazz.getDeclaredConstructor(Builder.class); 
       c.setAccessible(true); 
       return c.newInstance(this); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    } 
} 

、これはむしろエラーが発生しやすいと「ハック」されて終わる除き。私はすべてのサブクラスを作成する1つのBuilderを持つことができるようにしたい。

質問

はこれを行うには良い方法はありますか?ビルダーのデザインパターンは、私のニーズに合っていないかもしれません。これは機能しますが、正しくは感じません。

注:この質問の真のニーズは、Animalクラスの例ほど簡単ではありません。あなたは、多くの引数を含む親クラスへのサブクラスを構築しようとしていると思います。ビルダーパターンを使用すると、インスタンス化がはるかに容易になり、将来のサブクラスでは拡張が容易になります。

サブクラス化されたオブジェクトは、独自のメソッドのみを持ちます。余分なフィールドはなく、メソッドはサブクラスの型に厳密に定義されています。

I.e.ダックは鳥のサブクラスであり、それは突っ込む。 emuは鳥のサブクラスですが、私はそれが突き刺されることを望んでおらず、実行するだけです。しかし、私は彼らに名前と性別を持たせたい。

+0

誰かが、私はむしろ、コードレビューよりも、ここにこの投稿を理由に関するコメントを残していました。理由は、これが本物のStackOverflowの質問であるからです...私が試したコードを提供しましたが、それはきれいなJavaソリューションではないことが分かりました。私はビルドして私を見せるための出発点として私のサンプルコードを使ってより良い答えを得るのを助ける人を欲しがっていました。 – rosenthal

答えて

2

ユーザーがAnimalクラスを指定するのではなく、各Animalサブクラスに、そのAnimalをビルドできる独自のBuilderがあるようにします。

です:

public abstract class Animal { 
    protected Animal(Builder<?> builder) { ... } 

    public abstract static class Builder<T extends Animal> { 
    // setters for fields common to all animals go here 

    public abstract T build(); 
    } 
} 

public final class Dog extends Animal { 
    private Dog(Builder builder) { 
    super(builder); 
    } 

    public static final class Builder extends Animal.Builder<Dog> { 
    @Override 
    public Dog build() { 
     return new Dog(this); 
    } 
    } 
} 
+0

これは私があなたの答えを読む前に試したことです。私はこれまでのところ最高の気がします – rosenthal

関連する問題