0

以下は、基本的なビルダー パターンです。

enum AccountType {
     BASIC,PREMIUM;
}


class AccountBuilder {  
     private AccountBuilder(Builder builder) {}

     private static class PremiumAccountBuilder extends Builder {
           public PremiumAccountBuilder () {
              this.canPost = true;
           }

           public PremiumAccountBuilder image(Image image) {
               this.image = image;
           }
     }

     public static class Builder {
            protected String username;
            protected String email;
            protected AccountType type;
            protected boolean canPost = false;
            protected Image image;

            public Builder username(String username) {
                this.username = username;
                return this;
            }

            public Builder email(String email) {
                this.email = email;
                return this;
            }

            public Builder accountType(AccountType type) {
                this.type = type;
                return (this.type == AccountType.BASIC) ? 
                        this : new PremiumAccountBuilder();
            }

            public Account builder() {
                return new Account (this.name,this.email,this.type, this.canPost, this.image);
            }

     } 
}

したがって、プレミアム アカウントは基本的に canPost をオーバーライドし、画像を設定できます。

次のようなことができるかどうかわかりません

Account premium = new AccountBuilder.Builder().username("123").email("123@abc.com").type(AccountType.PREMIUM).image("abc.png").builder();

typeプレミアムアカウントの場合、メソッド呼び出しの後と同じように、メソッド呼び出しを行うことができimageます。

画像メソッドを認識して見つけることができなかったため、エラーが発生しました。これが正しい方法であるかどうかはわかりませんが、それよりも良い方法はありますか?

4

1 に答える 1

1

accountTypeメソッドBuilderを持たないtype のオブジェクトを返します。考えられる解決策は、 を無視するだけのメソッドをクラスimageに追加することです。このメソッドは、; 別の方法として、メソッドに を渡すこともできます。このメソッドは、をのコンストラクタに渡す役割を果たします。imageBuilderImagePremiumBuilderimageImageImageaccountTypeImagePremiumBuilder

于 2013-07-24T15:57:46.473 に答える