我在Java中使用此单例类,并且在一种方法中,我需要一个在Main中实例化的类的对象。我不知道如何将该对象传递给此方法,因为此代码是在单例类的构造函数中编写的,因为我需要在程序启动后立即执行它。
我应该从构造函数中取出代码并将其设置为我从Main调用的独立方法(尽管我不希望这样做)还是有其他方法吗?
有任何想法吗?
码:
主要:
public static void main(String[] args) {
X x; // This is the object I need to pass to the singleton class
}
单例课程:
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>);
}
}
我还没有添加整个代码。只是我卡住的一个片段。
最佳答案
您有两个主要选择。
第一个会产生嘲讽的how叫-正确的是因为这是一条黑暗的地狱隧道。
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
以获得大量示例。