我在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以获得大量示例。

10-07 16:12
查看更多