假设我有两个类A
和B
,而后者又有一些方法,something()
和nothing()
,并创建了B
的实例在A
中,作为
public class A {
public A() {
B b = new B();
b.nothing();
}
public void something() {
...
}
}
调用b.nothing()
是所有标准内容,但实际上b
可以调用a.something()
的任何方法,假设A
的实例被调用{{1} }}。如果没有,为什么在概念上错误?
答案 0 :(得分:1)
是否有任何方法可以通过实例b调用a.something()
您无法在方法中掌握来电者,否,无法做到这一点。
如果没有,为什么这在概念上是错误的?
我立即想到两个问题:
来电者的类型是什么?既然任何人都可以打电话给b.nothing()
,你就不能假设它是一个Object
会导致很多丑陋的演员。
b.nothing()
的实施不应该关心关于谁在打电话给他。如果您重构A
并将b.nothing()
的呼叫转移到其他类,会发生什么?如果b.nothing()
突然停止工作,那将是非常令人惊讶的。
答案 1 :(得分:1)
我认为在概念上没有任何错误。
但是,要使机制工作,b
需要知道调用A
的{{1}}实例。为此,something()
的构造函数或其B
方法需要将nothing()
引用作为参数。
示例1:
A
示例2:
public class B {
public void nothing(A a) {
...
a.something();
...
}
}
示例3:
第三种方式适用于某些情况。如果public class B {
private final A a;
public B(A a) {
this.a = a;
}
public void nothing() {
...
this.a.something();
...
}
}
是B
的内部类,则它具有对其A
的关联实例的隐式引用。
A
}
答案 2 :(得分:0)
b.nothing()
可以调用a.something()
的唯一方法是告诉B
关于A
实例的实例。例如:
b.nothing(this);
其中B.nothing看起来像:
public void nothing(A a)
{
// Do other stuff
a.something();
}
或者,您可以将构造函数中的this
传递给B
,这将保留引用:
B b = new B(this);
b.nothing();
请注意,在构造函数调用期间让this
转义通常是一个坏主意 - 您要让B.nothing()
调用A.something()
对象不是' t完全初始化 - 它的构造函数还没有完成执行。这有时会导致不良和难以诊断的行为。
答案 3 :(得分:0)
要执行此操作,b
需要引用a
。有两种方法可以提供:
B
的构造函数中传递此类引用,或者为B
提供适当的setter。B
是A
的内部类,那么它会隐含地提供这样的引用。