是否可以编写一个静态方法来更改该类对象的所有实例?

时间:2019-01-09 23:23:24

标签: java methods static instance

我试图通过静态方法设置PanelGen类的所有实例的背景色,以便另一个类可以一次更改所有Panels的颜色。

例如:

 PanelGen a = new PanelGen(Color.red);
 PanelGen b = new PanelGen(Color.blue);

然后在PanelGen类中:     公共静态无效的changeColor(Color newColor)     {      //做一些改变a和b颜色的事情     }

这样,外部类(例如“ GameMaster”)可以同时更改a和b的颜色

PanelGen.changeColor(Color.Orange);

3 个答案:

答案 0 :(得分:3)

一种方法是在PanelGen类中有一个静态列表。然后在构造函数中,将该值添加到列表中。像这样:

    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());
        }


    }

答案 1 :(得分:0)

Answer by Justin基本上是正确的,可以正常工作。我有两个问题。

内存泄漏

一个我担心的问题是内存泄漏,假设面板可以在应用终止之前被丢弃。

在面板列表中使用弱引用,以避免内存泄漏。

如果面板始终存在直到应用程序执行结束,那么就没有问题。您可以忽略这一点。

关注点分离

另一个关注点是关注点分离。如果面板被设计为具有不同的颜色,但是诸如GameMaster之类的其他实体想要控制所有面板的颜色,则GameMaster类应该包含面板实例的集合,而不是面板上的静态列表类。

然后如何向GameMaster注册每个新面板?如果您只有一个实例化的地方,请将该实体传递给GameMaster的引用以访问其列表并添加新面板。最有可能的是,GameMaster本身就是实例化面板的位置,并且可以在其中注册每个新实例及其面板列表。

顺便说一句,你的名字PanelGen困扰着我。如果“ gen”是指“ generator”,那么您可能会将面板管理器/生成器与面板混为一谈。在这种情况下,应该有两个类,而不是一个组合。在这种情况下,这是至关重要的一点,正如我们在上面讨论的那样,在哪里分配实例化面板的责任,然后跟踪面板的存在并统一更改其颜色。

答案 2 :(得分:0)

如果所有面板必须具有相同的颜色,则应具有一个颜色实例,而不是尝试同步 N 个不同的实例。

  class PanelGen {
     static Color colour;
     static void changeColour(Color c)  { colour = c }
     Color getColour() { return colour; }
         :
     }

可以将getColour方法声明为static,但我认为您可能想像实例成员一样使用它。

(是的,颜色/颜色是故意的:-))