Java 创建单例时出现问题
我正在尝试创建一个Java 创建单例时出现问题,java,Java,我正在尝试创建一个Singleton类,该类将从另外两个类访问。有人能告诉我以下代码有什么问题吗?我就是搞不懂 import java.util.LinkedList; public class MessageQueue { private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();; private static Messag
Singleton
类,该类将从另外两个类访问。有人能告诉我以下代码有什么问题吗?我就是搞不懂
import java.util.LinkedList;
public class MessageQueue {
private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();;
private static MessageQueue messageQueue = null;
/** A private Constructor prevents any other class from instantiating. */
private MessageQueue() {
}
/** Static 'instance' method */
public static MessageQueue getInstance() {
if (MessageQueue.messageQueue == null) {
System.out.println("Creating MessageQueue instance.");
MessageQueue.messageQueue = new MessageQueue();
}
return MessageQueue.messageQueue;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
没有错误,但是
System.out.println("Creating MessageQueue instance.");
每次我都会被处决
MessageQueue messageQueue = MessageQueue.getInstance();
编辑1
import java.util.LinkedList;
public class MessageQueue {
private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();;
private static final MessageQueue messageQueue = new MessageQueue();
/** A private Constructor prevents any other class from instantiating. */
private MessageQueue() {
System.out.println("problem...");
}
/** Static 'instance' method */
public static MessageQueue getInstance() {
return MessageQueue.messageQueue;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
import java.util.LinkedList;
公共类消息队列{
私有静态最终LinkedList队列=新LinkedList();;
private static final MessageQueue MessageQueue=new MessageQueue();
/**私有构造函数阻止任何其他类实例化*/
私有消息队列(){
System.out.println(“问题…”);
}
/**静态“实例”方法*/
公共静态MessageQueue getInstance(){
返回MessageQueue.MessageQueue;
}
公共对象克隆()引发CloneNotSupportedException{
抛出新的CloneNotSupportedException();
}
}
最好像这样定义和实例化singleton对象:
MessageQueue messageQueue = MessageQueue.getInstance();
private static final MessageQueue messageQueue = new MessageQueue();
然后,getInstance
将只是:
public static MessageQueue getInstance() {
return MessageQueue.messageQueue;
}
通过这种方式,您的单例对象将被实例化,并且将是线程安全的,因为它是由类加载器创建的。首先,您没有指定任何错误。如果你想得到帮助,你应该给我们尽可能多的信息 其次,在Java中创建singleton的最好方法是:
public enum MySingleton {
INSTANCE;
//whatever methods you want to implement
}
您可以这样访问它:
MySingleton.INSTANCE.which()
如果您这样做的话会更容易
public class MessageQueue {
private static final MessageQueue INSTANCE= new MessageQueue();
public static MessageQueue getINSTANCE() {
return INSTANCE;
}
private MessageQueue() {
}
}
发生了什么错误?我所能看到的是这里有两个分号:
private static final LinkedList<ServerDataEvent> queue = new LinkedList<ServerDataEvent>();;
private static final LinkedList queue=new LinkedList();;
一个线程安全的较短版本
public enum MessageQueue {
INSTANCE;
private final Queue<ServerDataEvent> queue =
new ConcurrentLinkedQueue<ServerDataEvent>();
public void addEvent(ServerDataEvent event) { queue.add(event); }
}
公共枚举消息队列{
例子
专用最终队列=
新建ConcurrentLinkedQueue();
public void addEvent(ServerDataEvent事件){queue.add(event);}
}
或
公共枚举消息队列{
;
专用静态最终队列=
新建ConcurrentLinkedQueue();
publicstaticvoidaddevent(ServerDataEvent事件){queue.add(event);}
}
最简单的方法:
private static final MessageQueue messageQueue = new MessageQueue();
public static MessageQueue getInstance() {
return MessageQueue.messageQueue;
}
这里的错误是你的第一句话:我试图创建一个ton类,它将从另外两个类实例化。-你看到问题了吗?似乎单身不是你想要的。是否发生了错误?是否未创建单例?这不是线程安全的。此外,问题标题中提到的问题是什么?singleton的逻辑似乎是正确的。你看到什么问题了?您是否遇到编译时错误,或者逻辑不适合您?代码的基础看起来不错,但事实上它不是线程安全的。你遇到了什么问题?没有得到一个实例?其他?没有错误,但是
System.out.println(“创建MessageQueue实例”)每当我执行MessageQueue=MessageQueue.getInstance()时,就会执行code>代码>@Michael J.Lee:非常感谢,意识到输入错误并修复:)@anubhava:我照你说的做了。但我还添加了一个简单的System.out.println(“内部构造函数”)代码>构造函数中的行。在此之后,如果我执行MessageQueue=MessageQueue.getInstance()
从两个不同的类中,我可以同时看到构造函数中的
。这是预期的吗?谢谢。请注意,如果创建实例会引发异常,那么由线程加载程序创建实例可能会导致问题。如果这样做,那么类将无法加载,错误消息将。。。对于使用你的类的人来说没有什么用处(即,你只是收到一条消息,它无法加载任何这样的类)。@Bhushan:你是否像我上面建议的那样更改了你的getInstance()
方法?正如您所看到的,构造甚至不再在getInstance()
中发生,因此无论您调用getInstance()
多少次,它都不应该在构造函数内部打印。@RHSeeger:这是一个有效的观点。除此之外,另一种无法使用加载程序创建的实例的情况是,构造函数需要传递一些运行时参数。
private static final MessageQueue messageQueue = new MessageQueue();
public static MessageQueue getInstance() {
return MessageQueue.messageQueue;
}