2012-02-15 8 views
1

私は、クライアントが定義されている場合はGuiceのモジュールは

final class SocketClient { 

    private Integer port; 

    @Inject 
    SocketClient(Integer port) { 
     this.port = port; 
    } 

    @Override 
    public void send(String message) { 
     System.out.println("Sending message:- "+message+" to port "+port); 
    } 
} 

がどのように私はの複数のインスタンスをインスタンス化するために、Guiceのを使用しますSocketClientはそれぞれ異なるポートに接続していますか?

答えて

2

心に来る最初のソリューションは、

interface SocketClientFactory { 
    SocketClient createForPort(int port); 
} 

のように見え、その後assisted injection extensionを使用して工場出荷時のインスタンスを取得SocketClientFactoryインタフェースを作成することです。

+0

補助注射は、私が後にしたように見える。 – Martin

1

シングルトンのPortAllocatorのように、既に割り当てられているポートを追跡する必要があります。次に、あなたのクライアントにそのを注入できます。あなたが好きならインターフェースを使用して、あなたは、DE-カップルができ

@Singleton 
class PortAllocator { 
    private int nextPort = 1234; 

    int allocatorPort() { 
    return nextPort++; 
    } 
} 

@Inject 
SocketClient(PortAllocator portAllocator) { 
    this.port = portAllocator.allocatePort(); 
} 

PortAllocatorは、次のようになります。あなたは糸の安全性についても考えることができます。

あなたはここでGuiceから多くを得ていないと主張するかもしれませんが、あなたは組み込みのシングルトン状態管理を取得しており、静的性の欠如はテストを容易にします。

+0

丁寧に回答していますが、私も接続したいポートを知っています。 – Martin

+0

はい、私はあなたの質問を少し違って解釈しました。 AssistedInjectまたはFactoryパターンは適切なアプローチのように見えます。 –

関連する問題