是否可以编写一个静态方法来更改 class 对象的所有实例
Is it possible to write a static method that can alter all instances of an object of that class
我正在尝试通过静态方法设置 PanelGen class 所有实例的背景颜色,以便另一个 class 可以立即更改所有面板的颜色。
这方面的一个例子是:
PanelGen a = new PanelGen(Color.red);
PanelGen b = new PanelGen(Color.blue);
然后在 PanelGen 中 class:
public static void changeColor(Color newColor)
{
//做一些改变a和b的颜色的事情
}
这样,外部class如"GameMaster"可以同时改变a和b的颜色
PanelGen.changeColor(Color.Orange);
一种方法是在您的 PanelGen class 中有一个静态列表。然后在构造函数中,将该值添加到列表中。像这样:
public class PanelGen{
private static List<PanelGen> panelGenList = new ArrayList<>();
private Color color;
public PanelGen(Color c){
color = c;
PanelGen.panelGenList.add(this);
}
public void setColor(Color c){
color = c;
}
public Color getColor(){
return color;
}
public static void changeColor(Color c){
for(PanelGen t: panelGenList)
t.setcolor(c);
}
public static void main(String [] args){
PanelGen a = new PanelGen(Color.red);
PanelGen b = new PanelGen(Color.blue);
System.out.println(a.getColor());
System.out.println(b.getColor());
PanelGen.changeColor(Color.Orange);
System.out.println(a.getColor());
System.out.println(b.getColor());
}
}
如果所有面板都必须具有相同的颜色,则只有一个颜色实例,而不是尝试同步 N 个不同的实例。
class PanelGen {
static Color colour;
static void changeColour(Color c) { colour = c }
Color getColour() { return colour; }
:
}
可以声明 getColour
方法 static
但我假设您可能希望将其用作实例成员。
(是的,color/colour 是故意的:-))
基本上是正确的,可以工作。我有两个顾虑。
内存泄漏
一个问题是内存泄漏,假设面板可以在应用程序终止之前被丢弃,正如我评论的那样。
在面板列表中使用弱引用,以避免内存泄漏。
如果面板一直存活到应用程序执行结束,那么就没有问题。这点可以忽略。
关注点分离
另一个问题是关注点分离。如果面板设计为具有单独的颜色,但其他一些实体(例如 GameMaster)想要控制所有面板的颜色,那么 GameMaster class 应该包含面板实例的集合,而不是静态的面板上的列表 class。
那么如何向GameMaster注册每个新面板?如果您只有一个实例化的地方,请将该实体传递给 GameMaster 的引用以访问其列表并添加新面板。最有可能的是,GameMaster 本身就是实例化面板的地方,并且可以在那里注册每个新实例及其面板列表。
顺便说一下,你的名字 PanelGen
让我很烦。如果“gen”指的是“generator”,那么您可能会将 panel manager/generator 与 panels 混为一谈。应该有两个 classes,在这种情况下,不是一个组合。在这种情况下,这是一个关键点,正如我们上面讨论的那样,在哪里分配实例化面板的责任,然后跟踪它们的存在,并统一改变它们的颜色。
我正在尝试通过静态方法设置 PanelGen class 所有实例的背景颜色,以便另一个 class 可以立即更改所有面板的颜色。
这方面的一个例子是:
PanelGen a = new PanelGen(Color.red);
PanelGen b = new PanelGen(Color.blue);
然后在 PanelGen 中 class: public static void changeColor(Color newColor) { //做一些改变a和b的颜色的事情 }
这样,外部class如"GameMaster"可以同时改变a和b的颜色
PanelGen.changeColor(Color.Orange);
一种方法是在您的 PanelGen class 中有一个静态列表。然后在构造函数中,将该值添加到列表中。像这样:
public class PanelGen{
private static List<PanelGen> panelGenList = new ArrayList<>();
private Color color;
public PanelGen(Color c){
color = c;
PanelGen.panelGenList.add(this);
}
public void setColor(Color c){
color = c;
}
public Color getColor(){
return color;
}
public static void changeColor(Color c){
for(PanelGen t: panelGenList)
t.setcolor(c);
}
public static void main(String [] args){
PanelGen a = new PanelGen(Color.red);
PanelGen b = new PanelGen(Color.blue);
System.out.println(a.getColor());
System.out.println(b.getColor());
PanelGen.changeColor(Color.Orange);
System.out.println(a.getColor());
System.out.println(b.getColor());
}
}
如果所有面板都必须具有相同的颜色,则只有一个颜色实例,而不是尝试同步 N 个不同的实例。
class PanelGen {
static Color colour;
static void changeColour(Color c) { colour = c }
Color getColour() { return colour; }
:
}
可以声明 getColour
方法 static
但我假设您可能希望将其用作实例成员。
(是的,color/colour 是故意的:-))
内存泄漏
一个问题是内存泄漏,假设面板可以在应用程序终止之前被丢弃,正如我评论的那样。
在面板列表中使用弱引用,以避免内存泄漏。
如果面板一直存活到应用程序执行结束,那么就没有问题。这点可以忽略。
关注点分离
另一个问题是关注点分离。如果面板设计为具有单独的颜色,但其他一些实体(例如 GameMaster)想要控制所有面板的颜色,那么 GameMaster class 应该包含面板实例的集合,而不是静态的面板上的列表 class。
那么如何向GameMaster注册每个新面板?如果您只有一个实例化的地方,请将该实体传递给 GameMaster 的引用以访问其列表并添加新面板。最有可能的是,GameMaster 本身就是实例化面板的地方,并且可以在那里注册每个新实例及其面板列表。
顺便说一下,你的名字 PanelGen
让我很烦。如果“gen”指的是“generator”,那么您可能会将 panel manager/generator 与 panels 混为一谈。应该有两个 classes,在这种情况下,不是一个组合。在这种情况下,这是一个关键点,正如我们上面讨论的那样,在哪里分配实例化面板的责任,然后跟踪它们的存在,并统一改变它们的颜色。