Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Singleton-IsEnabled?_Java_Design Patterns - Fatal编程技术网

Java Singleton-IsEnabled?

Java Singleton-IsEnabled?,java,design-patterns,Java,Design Patterns,对于使用isEnabled方法的singleton,有什么好的接口想法吗 例如,我有一个UDPClient,只想创建一次套接字,所以我将它设置为单例。如果配置显示要启用,我希望应用程序继续,但它不能 我能比这个客户机代码和由此产生的单例实现做得更好吗?(如果我搞砸了单身汉,请纠正我)。如果这有什么不同,它将在web应用程序中使用 public class UDPConnectionManager { private static final UDPConnectionManager IN

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

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

我能比这个客户机代码和由此产生的单例实现做得更好吗?(如果我搞砸了单身汉,请纠正我)。如果这有什么不同,它将在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");
}

如果您希望它有点火,即使它不可用也会忘记,那么您可以减轻客户端的负担,只需将
send()
方法放在singleton上

通过这样做,您可以让singleton进行检查,如果为null,则不发送它

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

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

(PDF,第27页)

如果您希望它有点像火,即使它不可用也会忘记,那么您可以减轻客户端的负担,只需将
send()
方法放在singleton上

通过这样做,您可以让singleton进行检查,如果为null,则不发送它

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

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

(PDF,第27页)

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


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

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


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

我喜欢这个,所以我投了更高的票。问题是我没有提到还有5种其他方法,类似于send,我需要对其进行if-notnull测试。5种方法还不错。我得整晚考虑这个问题。谢谢你的洞察力。我喜欢这个,所以我投了更高的票。问题是我没有提到还有5种其他方法,类似于send,我需要对其进行if-notnull测试。5种方法还不错。我得整晚考虑这个问题。谢谢你的洞察力。