Java:从“包含”类调用方法

时间:2011-09-26 15:28:16

标签: java class call


我有这样的类层次结构:

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!!!
             */
        }
    }
}

是否可以在该位置从B类调用A类的方法?

问题是我在A中有一个B对象列表,只要在其中一个B对象中单击一个按钮,就必须在A中进行更改。

谢谢!

3 个答案:

答案 0 :(得分:2)

没有允许您从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();
        }
    }

答案 1 :(得分:0)

没有。您需要从A类中获取B实例的引用。

答案 2 :(得分:0)

是的,你必须有一个参考(正如已经说过的那样)。

我只是在这里添加,提到这可能会有点粘。如果可以,我建议重新设计你的结构,这样你就不需要双引用了,如果不是,我强烈建议你不要尝试在构造函数中进行设置 - 而是调用a.init(b)和/或b.init(a)设定值。

它可能正如现在所写,但随着时间的推移,在构造函数中初始化将导致越来越多的限制和挫折。并不是说你以后不能重构,但我想我只是建议这样做,所以你在决定重构之前不要浪费太多时间敲打你的头。

如果你考虑它,那么这样做会使你无法实例化其中一个,使测试更加困难,如果你在类的构造中添加任何进一步的依赖,它就变得不可能了(这开始达到与多重继承相同的复杂性。)

您可能还想考虑将自己添加到公共源作为侦听器或使用事件总线(可能是最干净和最简单的解决方案)。