是否有在Java中运行静态变量类的多个实例的解决方案?



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

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

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

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

你懂的。基本上,在我之前的程序员认为模拟器只有一个实例,所以他们让它静态地可访问。

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

让它在不静态的情况下工作可能是最好的选择,我知道,但正如你所想象的那样,这将花费大量的重构和时间。

唯一有效的方法是运行多个主方法(所以在我的IDE中运行它几次,或者在单独的窗口中作为.jar运行它)。我认为这是因为每个主方法或JVM实例或任何作为一种容器,所以静态不干扰?

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

我认为这是可以使用Java类加载器(ClassLoader),但这将导致您进入一个痛苦的世界。您必须使用不同的类加载器创建子应用程序。我从来没有这样做过,但我相信这就是应用服务器的工作方式。

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

如果不访问instance,你必须创建多个实例变量或一些动态注册表,比如存储引用的映射。

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

我能想到的最快和最简单的方法是用一个虚拟变量

重写构造函数
public Simulator(Boolean isDummy){
}

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

相关内容

最新更新