运行 class 的多个实例在 Java 中有静态变量吗?

Is there a workaround for running multiple instances of a class with static variables in Java?

我在做一个已有的模拟器软件,结构基本是这样的(它有一个包含自身的静态成员变量):

public class Simulator {
    private Static Simulator instance;

    public Simulator(){
        instance = this;
        //blah
        //blah
        //other things
    }

}

然后很多方法像这样访问模拟器的静态实例:

for(Foo f : Simulator.instance.getFoo() ){
    //blah
}

你懂的。基本上,在我之前的程序员都假设只有一个 Simualtor 实例,所以他们让它可以静态访问。

问题是我现在想要 运行 它的多个实例,所以这个静态部分变得很烦人。

我知道,在不静态化的情况下进行这项工作可能是最好的选择,但正如您可以想象的那样,这将需要大量的重构和时间。

唯一有效的方法是 运行 多个主要方法(因此 运行 在我的 IDE 中多次使用它,或者 运行 它作为 .jar在单独的 windows) 中。我假设这是因为每个主要方法或 JVM 实例或任何东西都充当一种容器,所以静态不会干扰?

我想知道的是,是否有一个 hacky 解决方法,我可以使用(至少短期)来创建模拟器的多个实例,但在某种容器中,使静态实例不会受到干扰。

我能想到的最快、最老套的方法是用一个虚拟变量覆盖该构造函数

    public Simulator(Boolean isDummy){

    }

现在您可以选择在不影响其他人的情况下创建该 class 的多个实例。不确定您的情况是否可以接受参数开销。

我认为使用 Java class 加载程序 (ClassLoader) 是可能的,但这会把你带入一个痛苦的世界。您将不得不使用不同的 class 加载器创建每个子应用程序。我从来没有这样做过,但我相信这就是应用程序服务器的工作方式。

重构您的应用程序会容易得多。

您不必访问 instance,而是必须创建多个实例变量或一些动态注册表,例如存储引用的地图。

顺便说一下,instance 存储在构造函数中的方式是非常糟糕的做法,因为每次调用 new 时它都会被覆盖,并且以前的版本将会丢失。通常,您只想用一个对象初始化 instance