1

私は上流から来る2種類のペイロードを持っています:それはPayloadAまたはPayloadBです。1つのBuilderクラスに複数のBuilderパターンを入れる方法は?

PayloadA containesこれらの多くの分野:

createTimestamp 
sentTimestamp 
schemaId 
eventId 
producerId 
guid 
deviceId 
langId 
sessionId 

PayloadB containesこれらの多くの分野:

createTimestamp 
sentTimestamp 
schemaId 
eventId 
producerId 
eventType 
payloadVersion 
creationDate 
expirationSeconds 
payload 

だから、最初の5つのフィールドは、それらの間で共通しています。一般的には、より多くのフィールドがあります。

スレッドセーフなビルダーパターンを作成します。だから、両方のペイロードのすべてのフィールドを結合したPayloadビルダーパターンクラスを1つ用意する必要がありますか?あるいは、PayloadAPayloadBのビルダーパターンクラスを別のPayloadビルダークラスに入れて、PayloadAPayloadBの共通フィールドはPayloadクラスの一部になりますか?

この種の問題のビルダーパターンを作成する最良の方法は何ですか。 PayloadAビルダーパターンdeviceIdが必須フィールドであるとします。 PayloadBビルダーパターンeventTypeは必須フィールドです。

+0

共通属性をペイロードのような異なるクラスに移動します。 payloadAとpayloadBにペイロードクラスの構成を使用します。次をご覧ください:http://stackoverflow.com/documentation/design-patterns/1811/builder-pattern/17177/builder-pattern-in-java-with-composition –

+0

@Ravindrababuどのように見えるかの例を挙げてください好き?それは私がより良く理解するのに役立ちます。 – john

答えて

0

ここではstatic nested builder (item 2)パターンを使用することをおすすめします。ここで

あなたは

  1. を行うことができます何の共通属性
  2. abstractクラスPayloadを作成し、それぞれの静的ネストされたBuilderPayloadを拡張PayloadAPayloadBを作成します。
  3. これらのオブジェクトを使用/構築するメソッドでスレッドセーフを処理しておきます(Builderはスレッドセーフである必要はありません)。

ペイロード

public abstract class Payload { 

    private String createTimestamp; 
    private String sentTimestamp; 
    private String schemaId; 
    private String eventId; 
    private String producerId; 

    //getters, setters, equals, hashcode, toString, compareTo, etc. 
} 

PayloadA(PayloadBは同様であろう)

class PayloadA extends Payload { 
    private String guid; 
    private String deviceId; 
    private String langId; 
    private String sessionId; 

    private PayloadA() { 
     //avoid direct instantiation 
    } 

    public static class Builder { 

     private String guid; 
     private String deviceId; 
     private String langId; 
     private String sessionId; 

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

     public Builder(String deviceId) { 
      //validations 
      this.deviceId = deviceId; 
     } 

     public PayloadA build() { 
      //validations 
      return new PayloadA(); 
     } 

     //other setters returning this Builder 
    } 
} 

使用(上流DAから適切なペイロードを構築しますTA

public Payload constructPayload(final Data data) { 

    //implement any thread safety mechanism as requirdhere. 
    // synchronized is just for explanatory purposes 
    synchronized (data) { 
     if (data.getType().equals("PayloadA")) { 
      return new PayloadA.Builder(data.getDeviceId()) 
        //.setGuid("someGuid") 
        //other setters 
        .build(); 
     } else { 
      return new PayloadB.Builder(data.getEventType()) 
        //.setCreationDate("someCreationDate") 
        // other setters 
        .build(); 
     } 
    } 
} 

は、この情報がお役に立てば幸いです。

+0

これはかなり有望です。PayloadAまたはPayloadBクラスのいくつかのフィールドで、フィールドが設定されているかどうかにかかわらず、派生ベースを取得するフィールドがPayloadクラスにある場合を考えてみましょう。それをどうやってやるの?これは、ビルダーパターンの1つのPayloadクラスを作成し、コンストラクターでそのフィールドが設定されているかどうかを確認し、その変数の値を導出した基礎を確認できる場合に可能でした。 – john

+0

親クラスのフィールドが親クラスおよび/またはそのサブクラスの他のフィールドに基づいて派生している場合、これらの 'その他'フィールドのセッターは、呼び出されると親フィールド値を更新できます。 –

+0

@david大きなビルダーの問題は、PayloadAとPayloadBのいずれかのプロパティを設定すると、最終的には何を構築するのでしょうか? –

関連する問題