2015-12-25 12 views
8

私はクライアントのライブラリを持っており、私の休憩サービスへのHTTPリモート呼び出しを行ってから、List<DataResponse>を私のライブラリを呼び出す顧客に返しています。サービスには、DataResponseオブジェクトをラップするものがあれば、エラーとともに表示されます。ここで長いコンストラクタを作成しないようにする方法

public class DataResponse { 

    private final String response; 
    private final boolean isLink; 
    private final TypeOfId idType; 
    private final long ctime; 
    private final long lmd; 
    private final String maskInfo; 

    // below are for error stuff 
    private final ErrorCode error; 
    private final StatusCode status; 

    // constructors and getters here 

} 

は私のErrorCode列挙クラスです:

public enum ErrorCode { 

    // enum values 

    private final int code; 
    private final String status; 
    private final String description; 

    // constructors and getters 

} 

そして、ここでは私のStatusCode列挙クラスです:

public enum StatusCode { 
    SUCCESS, FAILURE; 
} 

あなたは私のDataResponseクラスで見ることができるように私はフィールドがたくさんあります私は非常に長いコンストラクタを持っていることに基づいて、DataResponseオブジェクトを作るときはいつも、私はnew DataResponse(.......)と大きな線を持っています。将来私はもっと多くのフィールドを持っているかもしれませんが、今のところ私はこれらのフィールドしか持っていません。

DataResponseオブジェクトを作成してから、List<DataResponse>を自分のライブラリから返すために使う良い方法はありますか?

+5

ビルダーパターンを使用できます。 – YoungHobbit

+0

http://stackoverflow.com/a/6395981/3885376 –

+0

私はビルダーにまだ依存しません。あなたにはたくさんの畑がありますか?分解の仕事のように聞こえる。 [この回答](http://stackoverflow.com/questions/33784390/object-oriented-design-how-important-is-encapsulation-when-therere-lots-of-da/33785266#33785266)を確認してください。後でコンストラクタにあまりにも多くのデータを渡していると感じたら、ビルダーパターンを使用できます。適切な分解は通常、そのトリックを行いますが。多くのパラメータを避けるのではなく、デフォルト値を提供する入れ子構造の構築を避けるために、BUILDERは便利です。 –

答えて

14

すぐにbuilder patternを使用しないでください。トン数がのタイプは必要ありません。フィールド。それは、オプションのフィールドの種類のものです。

ビルダーの必須プロパティは、コンストラクターを介して指定されます。メソッドを使用して値を定義することは強制されません。これらの値はオプションになります。

これにより、オブジェクトが部分的にしか構築されない可能性があります。このためにビルダーを使用すると、設計の乱用になります。


これであなたのタイプはdecomposeであるはずです。私はlmdまたはctimeが何であるか、または実際にはDataResponseが表すはずのものがわからないので、どのように分解するべきかを教えてもらえません。しかし、私はあなたに言うことができますcohesionそのようなものを決定するものです。

isLinkmaskInfoidTypeはおそらくDataResponseDetailsオブジェクトに分解することができます。今すぐ

class DataResponseDetails { 
    private boolean isLink; 
    private String maskInfo; 
    private TypeOfId idType; 

    public DataResponseDetails(boolean isLink, String maskInfo, TypeOfId idType) { 
     //... 
    } 
} 

あなたDataResponseDataResponseDetailsで構成することができます。

class DataResponse { 
    private DataResponseDetails details; 
    private String response; 
    //... 

    public DataResponse(DataResponseDetails details, String response, ...) { 
     //... 
    } 
} 

は、あなたのコンストラクタはまだあまりにも多くを必要と感じますか?もっと分解する!

+0

私は、オプションのクラス(GuavaまたはJava 8のもの)をオプションのフィールドとして使用してnull値を取り除くことを推奨します –

0

Joshua Blochは、Effective Java 2nd Editionの項目2で述べたように、ビルダーパターンの使用を検討することをお勧めします。

public class DataResponse { 

     private final String response; 
     private final boolean isLink; 
     private final TypeOfId idType; 
     private final long ctime; 
     private final long lmd; 
     private final String maskInfo; 

     // below are for error stuff 
     private final ErrorCode error; 
     private final StatusCode status; 

     // constructors and getters here 


     public static class Builder { 

      private final String response; 
      private final boolean isLink; 
      private final TypeOfId idType; 
      private final long ctime; 
      private final long lmd; 
      private final String maskInfo; 

      // below are for error stuff 
      private final ErrorCode error; 
      private final StatusCode status; 

      public Builder reponse(final String response) { 
       this.response = response; 
       return this; 
      } 

      public Builder isLing(final boolean isLink) { 
       this.isLink = isLink; 
       return this; 
      } 

      public DataResponse builder() { 
       return new DataResponse(this); 
      } 

      ... 

     } 

     private DataResponse(final Builder builder) { 
      this.response = builder.response; 
      this.isLink = builder.isLink; 
     } 
    } 

、その後、次のように何かをする:ここで

は、コードがそれを使用してのように見えることができるものである

DataResponse response = new DataResponse.Builder().reponse(anyResponse).isLink(isLink).build(); 
4

たぶん、あなたは、フィールドの小さな論理グループを識別ANオブジェクトにそれらを移動することができます自分のクラスの次に、これらのオブジェクトをすべてDataResponseオブジェクトに組み立てることができます。

関連する問題