2011-08-02 44 views
1

使用isEnabled方法創建一個單體的良好接口的任何想法?Java Singleton - IsEnabled?

例如,我有一個UDPClient,只想創建一次Socket,所以我將它設置爲單例。我希望應用程序繼續,如果配置說啓用它,但它不能。

我可以做得比這個客戶端代碼和單身實現更好嗎? (並請糾正我,如果我搞砸了單身人士)。如果它有任何不同,這將用於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種方法,類似於發送,我需要做如果不是null測試。 5種方法也不錯。我不得不在晚上想想這個。感謝您的洞察力。 –

1

有什麼不妥的地方是每本身的方式,但如果您的所有用例看起來像上面的話,我只希望把send()方法在單例中,並決定它是否被啓用。如果你想知道它是否通過了,你可以讓它返回一個布爾值。或者,如果您不想在單例連接管理器上使用該方法,則可以編寫另一個可以工作的類,然後將其卸載。

當然,如果您打算使用isEnabled()方法來決定其他操作,那麼無論如何您都可能需要它在singleton上可用,並且在我的書中沒有任何問題。