Java:从一个";“所载”;班

Java:从一个";“所载”;班,java,class,call,Java,Class,Call,我有这样的类层次结构: 在那个位置,可以从类B调用类a的方法吗? 问题是我在a中有一个B对象的列表,每当在其中一个B对象中单击一个按钮时,必须在a中进行更改 谢谢大家! 不存在允许您从B转到A的隐式关联 您需要: 更改B以保留对a的相应实例的引用 在B的构造函数中初始化该引用 使用它调用A的方法 代码: public class A { private B obj; public A() { obj = new B(this); ...


我有这样的类层次结构:

在那个位置,可以从类B调用类a的方法吗?

问题是我在a中有一个B对象的列表,每当在其中一个B对象中单击一个按钮时,必须在a中进行更改


谢谢大家!

不存在允许您从
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();
        }
    }

否。您需要从
B
类中获得对
a
实例的引用。

是的,您必须返回引用(如前所述)

我在这里加上一句只是想说这会有点粘。如果可以,我建议重新设计您的结构,这样您就不需要双重引用,如果不需要,我强烈建议您不要尝试在构造函数中进行设置——而是调用a.init(b)和/或b.init(a)来设置值

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

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


您可能还想考虑将两者都添加到一个公共源中作为侦听器或者使用事件总线(可能是最干净和最简单的解决方案)。如果a中有一个B列表,您可以在a中定义MouseListener并将其添加到每个B中。但是你仍然不能从B调用A,除非你在B中有一个对A的引用,下划线让我的眼睛流血:/。严肃地说,您必须将method1更改为public。

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