Java: вызов метода из «содержащегося» класса - PullRequest
1 голос
/ 26 сентября 2011


У меня есть иерархия классов, подобная этой:

public class A {

    private B obj = new B();   // Inside this object 
                               // do I need a reference to here?
                               // (In order to call method1())

    public A(){    ...    }

    private void method1(){    ...    }
    private void method2(){    ...    }
}

// Other package
public class B {
    private JButton bt1 = new JButton("Button");

    public B(){
            ...
        bt1.addMouseListener(new MouseActionsListener(this));
    }

    public class MouseActionsListener implements MouseListener
    {
        @Override
        public void mouseClicked(MouseEvent event)
        {
            /*
             * I need to call method1() HERE!!!
             */
        }
    }
}

Можно ли вызвать метод класса A из класса B в этой позиции?

Проблема в том, что у меня есть список объектов B в A, и каждый раз, когда нажимается кнопка в одном из объектов B, в A. необходимо вносить изменения.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

Не существует неявной ассоциации, которая позволила бы вам перейти от B к A.

Вам потребуется:

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

В коде:

public class A {

    private B obj;

    public A() {
        obj = new B(this);
        ...
    }

    public void method1(){    ...    }
    public void method2(){    ...    }
}


public class B {

    private final A _a;

    public B(A a) {
        _a = a;
    }

    public class MouseActionsListener implements MouseListener
    {
        @Override
        public void mouseClicked(MouseEvent event) {
            _a.method1();
        }
    }
0 голосов
/ 26 сентября 2011

Да, у вас должна быть обратная ссылка (как уже было сказано).

Я только добавляю сюда, чтобы упомянуть, что это может немного залипнуть.Если вы можете, я предлагаю изменить структуру вашей структуры так, чтобы вам не нужна двойная ссылка, если нет, я настоятельно рекомендую вам не пытаться выполнить настройку в конструкторах - вместо этого вызовите a.init (b) и /или b.init (a) для установки значений.

Может работать так, как написано на данный момент, но со временем инициализация в конструкторах приведет к увеличению ограничений и разочарований.Не то, чтобы вы не могли рефакторизовать позже, но я думаю, что я просто предлагаю это, чтобы вы не тратили слишком много времени на то, чтобы стучать головой, прежде чем вы решите провести рефакторинг.таким образом получается, что вы не можете создать экземпляр только одного из них, что делает тестирование более трудным, и если вы добавите какие-либо дополнительные зависимости в конструкцию класса, это может стать невозможным (это начинает достигать такой же сложности, что и множественныенаследование).

Вы также можете рассмотреть возможность добавления обоих к общему источнику в качестве слушателей или использования шины событий (возможно, самое чистое и простое решение).

0 голосов
/ 26 сентября 2011

Нет.Вы должны иметь ссылку обратно на экземпляр A из вашего B класса.

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