2011-08-02 8 views
1

isEnabledメソッドを持つシングルトンの良いインターフェイスに関するアイデアですか?Java Singleton - IsEnabled?

たとえば、私はUDPClientを持っていて、Socketを1回だけ作成したいので、これをシングルトンとして設定します。設定を有効にするように設定してもアプリを続行したいが、できない。

このクライアントコードと結果のシングルトンの実装よりも優れた処理を行うことはできますか? (そして私がシングルトンを台無しにしてしまった場合は私に修正してください)。これは、Webアプリケーションで差があれば使用されます。

public class UDPConnectionManager { 
    private static final UDPConnectionManager INSTANCE = new UDPConnectionManager(); 
    private UDPClient udp = null; 

    private UDPConnectionManager() { 
     try { 
      InitialContext ic = new InitialContext(); 

      String udpHost = (String) ic.lookup("java:comp/env/udpHost"); 
      Integer udpPort = (Integer) ic.lookup("java:comp/env/udpPort"); 
      Boolean udpEnabled = (Boolean) ic.lookup("java:comp/env/udpEnabled"); 

      if (udpEnabled) { 
       udp = new UDPClient(udpHost, udpPort); 
      } 
     } catch (Exception e) { 
      log.error("UDP Connection Manager: error while setting up UDP Manager.", e); 
     } 
    } 

    public static UDPConnectionManager instance() { 
     return INSTANCE; 
    } 

    public UDPClient getUDPClient() { 
     return udp; 
    } 

    public Boolean isEnabled() { 
     return (udp != null); 
    } 
} 

クライアント:

UDPClient udpCM = UDPConnectionManager.instance(); 
if (udpCM.isEnabled()) { 
    UDPClient udpClient = udpcCM.getUDPClient(); 
    udpClient.send("test"); 
} 

答えて

3

あなたは、あなたが負担を軽減するかもしれない、それは事の並べ替えのファイア・アンド・フォーゲット・偶数であれば、その-利用できませんソートすることが予想される場合シングルトンにsend()メソッドを置くだけです。

これを行うことで、シングルトンにチェックを行い、ヌルであれば送信しないことができます。

public class UDPConnectionManager { 
    private UDPConnectionManager() { ... } 
    public static UDPConnectionManager instance() { ... } 

    public void send(String message) { 
     if(udp != null) { 
      udp.send(message); 
     } 
    } 
} 

Don't make the client do anything the module could do(PDF、27ページ)

+0

私はこれが好きなので、私はそれをupvoted。問題は、5つの他のメソッドがあることは言及していないことです。ヌルテストではない場合は、送信する必要があります。 5方法はそれほど悪くないです。私はこれについて夜間考える必要があります。洞察に感謝します。 –

1

それと間違って何も、それはそれ自体はある方法はありませんが、すべてのあなたのユースケースは、上記のように見える場合、私はちょうど置くところシングルトンにsend()メソッドを追加し、それを有効にするかどうかを決定します。 OKかどうかを知りたい場合は、ブール値を返すことができます。または、シングルトン接続マネージャでそのメソッドを使用したくない場合は、それが動作する別のクラスを作成し、代わりにそれをオフロードできます。

もちろん、isEnabled()メソッドを使用して他のアクションを決定する場合は、とにかくシングルトンで使用する必要があり、私の本で何も問題はありません。