2017-11-20 3 views
1

私は現在、公開APIがたくさんあるサービスを作っています。また、応答オブジェクトと要求オブジェクトは重複しています。だから私は、リクエスト/レスポンスオブジェクトのpojo作成を一般化できる方法があると考えていました。 応答オブジェクトは、1つまたは2つの追加フィールドを持つ要求オブジェクトと同じ場合があります。一般的なフィールドを持つことができるpojosを書くための最良の方法

例を挙げておきます。

@Data 
public class Request { 
    private A objA; 
    private B objB; 
} 

@Data 
public class Response { 
    private A objA; 
    private B objB; 
    private C objC; 
} 

@Data 
public class A { 
    private D objD; 
} 

@Data 
public class B { 
    private String sB; 
    private E obje; 
} 

@Data 
public class C { 
    private String sC; 
} 

Similary、D及びEは、同様のPOJOです。ことは、要求/応答オブジェクトには多くの類似点(オーバーラップするフィールド)があることです。

+0

'Request'と' Response'によって拡張される共通クラスを作成します。すべての共通フィールドをこのクラスに追加し、 'protected'とマークしますか?私は複雑さがこの質問にどこにあるのか分かりません。 – CKing

+0

'抽象クラス 'を利用してそこに共通のフィールドを配置します – Lino

+0

問題は、共通の基底型を定義する必要があることを示していません。アプリケーションで使用される型とテンプレートメソッドパターンの必要性親クラスが必要です。多くのクラスが同じフィールドを共有しているからといって、継承によって束縛される必要があるわけではありません。私はむしろそれらを別々に保つだけであろう。 – tsolakp

答えて

2

解決策はおそらく継承です。重複するフィールドを持つ親抽象オブジェクト型を作成し、要求オブジェクトと応答オブジェクトでそれを拡張し、必要な余分な(一意の)フィールドを指定します。

継承

public abstract class Common { 
    private String overlapfield1; 
    private String overlapfield2 
} 

public class Request extends Common { 
    private String requestField1; 
    private String requestField2; 
} 

public class Response extends Common { 
    private String responseField1; 
    private String responseField2; 
} 

あなたはまた、組成物を使用して、この近づくことができます:重複フィールドを持つオブジェクト型を作成し、要求/応答タイプのサブオブジェクトとしてこのオブジェクトを含める:

作曲

public class Common { 
    private String overlapfield1; 
    private String overlapfield2 
} 

public class Request { 
    private String requestField1; 
    private String requestField2; 
    private Common common; 
} 

public class Response { 
    private String responseField1; 
    private String responseField2; 
    private Common common; 
} 

ありますこのアプローチや他のボードで広く議論されているそれぞれのアプローチに賛否両論があります。しかし、これらは、このような問題に対処するための2つの標準的なアプローチです。

0

本当にあなたが達成しようとしているものによって決まります。私はそれがフィールドを繰り返す巨大な問題ではありませんが、あなたが達成しようとしていることを理解できる実際の世界の状況ではなく、抽象的なユースケースを与えました。

@Dataオブジェクトを同じサービスに渡したいと思うかもしれませんか?この場合、クラスは複数のインタフェースを実装できるため、インタフェースを使用することができます。

例:

public interface AContiner { 
    A getA(); 
    void setA(A a); 
} 

public interface BContiner { 
    B getB(); 
    void setB(B b); 
} 

@Data 
public class Bean1 implements AContainer { 
    private A a; 
} 

@Data 
public class Bean2 implements AContainer, BContainer { 
    private A a; 
    private B b; 
} 

public class MyFantasticService { 
    public void doStuffWithA(AContainer data) { 
     System.out.println(data.getA()); 
    } 
    public void doStuffWithB(BContainer data) { 
     System.out.println(data.getB()); 
    } 
} 
+0

これが彼の問題を解決するかどうかはわかりません。 RequestオブジェクトとResponseオブジェクトは、それらに作用するためのメソッド宣言を含んでいるかどうかにかかわらず、多くの重複フィールドを指定する必要があります。 –

+0

彼は彼が彼の問題をうまく説明しているか分からない。更新されたコメントを見る –

関連する問題