是否可以编写一个静态方法来更改 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,在这种情况下,不是一个组合。在这种情况下,这是一个关键点,正如我们上面讨论的那样,在哪里分配实例化面板的责任,然后跟踪它们的存在,并统一改变它们的颜色。