【发布时间】:2013-12-09 10:14:10
【问题描述】:
我正在编写一个监听器类,它随机创建一个 HttpListener
未使用的端口并监听它。我试图使它成为单例。然而我是
收听时发现很难保留那个单例对象null
到随机 HTTP 端口失败 10 次。
(我已将端口号和 HttpListener 实例显示为单例的成员 实例。但是还有很多其他成员我没有展示 简单。)这是我的代码:
class Listener
{
private static Listener listener = null; //singleton instance
//member variables
private HttpListener httpListener = null;
private int port = -1;
static Listener()
{
listener = new Listener();
}
private Listener()
{
try
{
port = //randomly generate
httpListener = new HttpListener();
//start listening
}
catch(Exception ex)
{
//cant listen on randomly chosen port
listener = null;
httpListener = null;
port = -1;
return;
}
}
}
但是在 catch()、listener = null 内部将 listener 设置为 null
只是一会儿。当默认构造函数返回时,它返回一个新的
Listener 的实例,因此静态构造函数中的 listener 总是有
分配给它的实例。因此,而不是 listener = null 默认内部
构造函数应该是this = null,这是无效的。
因此,我将整个代码移到了静态构造函数中。但这迫使我
- 要么创建实例成员(
port和httpListener)static要么 -
或在任何地方使用
listener.port、listener.httpListener类监听器 { 私有静态侦听器侦听器= null; //单例实例
//member variables private HttpListener httpListener = null; private int port = -1; static Listener() { listener = new Listener(); try { listener.port = //randomly generate listener.httpListener = new HttpListener(); //start listening } catch(Exception ex) { //cant listen on randomly chosen port listener = null; return; } } private Listener() { }}
我不明白
Q1是否制作port&httpListenerstatic? (这我觉得有点违反 OOP 原则)或
Q2是否将它们保留为实例成员并在任何地方使用listener.? (这是有问题的,因为我的实际代码中有很多这样的成员和方法,我必须在任何地方附加listener.)
或者我认为这一切都错了,应该采用不同的方法?
【问题讨论】:
-
你想破解一个端口吗?
-
why singletons are evil。在您所描述的上下文中,您似乎并不需要一个单例。
-
@BartoszKP 哦……这到底是怎么回事?
-
这真的很奇怪,你想完成什么?尝试avoid the XY problem。
-
@Mahesha999 问题是在这里强制使用单例。您真正拥有的是抽象工厂模式,而不是单例模式。
标签: c# java oop design-patterns singleton