我在Java中使用这个单例类,在一个方法中,我需要一个在Main中实例化的类的对象。我不知道如何将该对象传递给此方法,因为此代码是在singleton类的构造函数中编写的,因为我需要在程序启动时立即执行该代码。
我应该从构造函数中取出代码并将其作为一个独立的方法,我从Main调用它(虽然我不喜欢这个)或者还有另一种方法吗?
有什么想法吗?
代码:
主:
public static void main(String[] args) {
X x; // This is the object I need to pass to the singleton class
}
Singleton类:
public SomeSingletonClass {
private Queue<Y> someQueue; // Y is another class I have in my project
private SomeSingletonClass(){
someQueue.add(new Y(<some data>, <some data>, <here I need an object of X as the constructor needs it>);
}
}
我还没有添加整个代码。只是我被卡住的片段。
答案 0 :(得分:1)
您有两个主要选择。
第一个会产生嘲笑的嚎叫 - 这是正确的,因为它是一个黑暗的地狱隧道。
public class X {
}
public class Y {
public Y(String s, X x) {
}
}
public class Main {
public static X x = new X();
}
public class SomeSingletonClass {
private Queue<Y> someQueue = new LinkedList<>();;
private SomeSingletonClass() {
someQueue.add(new Y("Hello", Main.x));
}
}
在这里,我们将X
Main
创建为public static
,因此它现在基本上是与您的单身人士并行的全局状态。
大多数读者会理解这是多么令人讨厌,但它是最简单的解决方案,因此通常是采取的解决方案。
第二种选择是懒惰的构造。
public class BetterSingletonClass {
private BetterSingletonClass me = null;
private Queue<Y> someQueue = new LinkedList<>();
private BetterSingletonClass(X x) {
someQueue.add(new Y("Hello", x));
}
public BetterSingletonClass getInstance (X x) {
if ( me == null ) {
me = new BetterSingletonClass(x);
}
return me;
}
}
请注意,我没有努力使它成为一个真正的单身人士,或者这是线程安全的。您可以在其他地方搜索thread safe singleton
以获取大量示例。