Java Singleton - IsEnabled?

时间:2011-08-02 20:32:20

标签: java design-patterns

有关使用isEnabled方法的单例的良好接口的任何想法吗?

例如,我有一个UDPClient并且只想创建一次Socket,所以我将其设置为单例。我希望应用程序继续,如果配置说启用它,但它不能。

我可以做得比这个客户端代码和生成的单例实现更好吗? (如果我搞砸了单身,请纠正我)。如果有任何不同,这将在网络应用中使用。

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");
}

2 个答案:

答案 0 :(得分: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页)

答案 1 :(得分:1)

它本身的方式没有任何问题,但如果你的所有用例看起来都像上面那样,那么我只需要在单例上放置一个send()方法,然后判断它是否已启用。如果你想知道它是否通过了ok,你可以让它返回一个布尔值。或者,如果您不想在单例连接管理器上使用该方法,则可以编写另一个可以处理的类,并将其卸载到该类中。

当然,如果您打算使用isEnabled()方法来决定其他操作,那么无论如何您可能需要在单例上使用它,并且在我的书中没有任何问题。