我在 libgdx 中设计游戏,我决定将某些管理器类设为单例,因为我注意到我经常只使用一个类的一个实例,然后通过构造函数将同一个实例传递给许多其他类,这非常痛苦做。现在,我有一个管理器类,它在它的构造函数中初始化了许多其他类。我通过为每个类使用静态块初始化器来做到这一点,如下所示:
public class Example{
private static Example instance;
static{
try{
synchronized(Example.class){
instance = new Example();
}
}catch(Exception e){
throw new RunTimeException("Failure to initialize Example instance");
}
public static Example getInstance(){
return instance;
}
在主管理器中,我通过 getInstance 方法为每个类创建一个实例。
出现的问题是:假设我有静态单例类 Example1 和 Example2。
在 Example1 的构造函数中,我创建了一个名为:
example2 = Example2.getInstance();
但是因为 example2 和 example1 需要使用彼此的方法,所以在 Example2 的构造函数中我做了:
example1 = Example1.getInstance();
问题应该很容易看出。因为example1在等待example2完成初始化,而example2又需要example1的实例,最终通过上面的代码RunTimeException造成死锁崩溃。
仅使用两个示例类似乎很容易解决这个问题,但是当我有 6 个几乎都需要以某种方式进行通信的不同单例管理器类时,问题就变得复杂了。最简单的解决方案显然不会使用这种方法,但这需要我重写我的大部分代码。
我不知道如何在不遇到这个问题的情况下使用这种单例类方法,因为大多数类需要来自构造函数中其他类的信息才能运行。
我要从单例类的构造函数中删除所有代码,还是做其他事情?