运行 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
。
我在做一个已有的模拟器软件,结构基本是这样的(它有一个包含自身的静态成员变量):
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
。