首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Singleton - IsEnabled?

Java Singleton - IsEnabled?
EN

Stack Overflow用户
提问于 2011-08-03 04:32:20
回答 2查看 183关注 0票数 1

对于使用isEnabled方法的单例,有什么好的接口的想法吗?

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

我能比这个客户端代码和由此产生的单例实现做得更好吗?(如果我搞砸了单例,请纠正我)。这将在web应用程序中使用,如果它有任何不同的话。

代码语言:javascript
复制
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);
    }
}

客户端:

代码语言:javascript
复制
UDPClient udpCM = UDPConnectionManager.instance();
if (udpCM.isEnabled()) {
    UDPClient udpClient = udpcCM.getUDPClient();
    udpClient.send("test");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-03 04:36:37

如果您希望它是一种“一发即忘”甚至是不可用的东西,那么您可以减轻客户端的负担,只需将send()方法放在单例上。

通过这样做,您可以让单例执行检查,如果检查为空,则不发送它。

代码语言:javascript
复制
public class UDPConnectionManager {
    private UDPConnectionManager() { ... }
    public static UDPConnectionManager instance() { ... }

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

( ,第27页)

票数 3
EN

Stack Overflow用户

发布于 2011-08-03 04:45:52

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

当然,如果您计划使用isEnabled()方法来决定其他操作,那么您可能需要它在单例中可用,这在我的书中没有任何错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6918214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档