Можно ли написать статический метод, который может изменить все экземпляры объекта этого класса - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь установить цвет фона всех экземпляров класса PanelGen с помощью статического метода, чтобы другой класс мог изменить цвет всех панелей одновременно.

Примером этого может быть:

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

Затем в классе PanelGen: общедоступная статическая пустота changeColor (цвет newColor) { // Делаем то, что меняет цвет как a, так и b }

Таким образом, внешний класс, такой как "GameMaster", может изменить цвет как a, так и b

.
PanelGen.changeColor(Color.Orange);

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Если все панели должны иметь один и тот же цвет, тогда имейте один экземпляр цвета, а не пытайтесь синхронизировать N разных экземпляров.

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

Метод getColour может быть объявлен static, но я предполагаю, что вы, возможно, захотите использовать его, как если бы он был членом экземпляра.

(Да, цвет / цвет был преднамеренным: -))

0 голосов
/ 10 января 2019

Ответ Джастина в основном правильный и будет работать. У меня есть две проблемы.

Утечка памяти

Одной из проблем является утечка памяти, предполагая, что панели могут быть удалены до завершения работы приложения, как я прокомментировал.

Используйте слабые ссылки в списке панелей, чтобы избежать утечки памяти.

Если панели всегда сохраняются до конца выполнения приложения, проблем не возникает. Вы можете игнорировать этот пункт.

Разделение интересов

Другая проблема - это разделение интересов. Если панели имеют разные цвета, но какой-то другой объект, например GameMaster, хочет управлять цветом всех панелей, то именно класс GameMaster должен содержать коллекцию экземпляров панели, а не статический список на панели. учебный класс.

Как тогда зарегистрировать каждую новую панель в GameMaster? Если у вас есть только одно место, где вы создаете экземпляр, передайте этому объекту ссылку на GameMaster, чтобы получить доступ к его списку и добавить новую панель. Скорее всего, именно GameMaster является тем местом, которое создает экземпляры панелей и может регистрировать каждый новый экземпляр со своим списком панелей.

Кстати, ваше имя PanelGen беспокоит меня. Если «gen» относится к «генератору», то вы можете связывать менеджер / генератор панелей с панелями. В этом случае должно быть два класса, а не один комбо. Это жизненно важный момент в этом контексте, так как мы обсуждали выше, куда следует возложить ответственность за создание экземпляров панелей, отслеживание их существования и равномерное изменение их цвета.

0 голосов
/ 10 января 2019

Один из способов сделать это - иметь статический список в вашем классе 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());
        }


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...