我有这样的类层次结构:
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中进行更改。
谢谢!
答案 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)设定值。
它可能正如现在所写,但随着时间的推移,在构造函数中初始化将导致越来越多的限制和挫折。并不是说你以后不能重构,但我想我只是建议这样做,所以你在决定重构之前不要浪费太多时间敲打你的头。
如果你考虑它,那么这样做会使你无法实例化其中一个,使测试更加困难,如果你在类的构造中添加任何进一步的依赖,它就变得不可能了(这开始达到与多重继承相同的复杂性。)
您可能还想考虑将自己添加到公共源作为侦听器或使用事件总线(可能是最干净和最简单的解决方案)。