[英]Call method from instance
假設我有兩個類, A
和B
,反過來有一些方法, something()
和nothing()
,在A
創建B
的實例,如
public class A {
public A() {
B b = new B();
b.nothing();
}
public void something() {
...
}
}
調用b.nothing()
是所有標准的東西,但是有沒有任何方法,例如b
可以調用a.something()
,假設A
的實例被稱為a
。 如果沒有,為什么這在概念上是錯誤的?
是否有任何方法,例如b可以調用a.something()
你不能在方法中掌握調用者 ,所以, 不 ,沒有辦法做到這一點。
如果沒有,為什么這在概念上是錯誤的?
我立即想到兩個問題:
打電話的類型是什么? 因為任何人都可以調用b.nothing()
,所以你不能假設它是一個Object
會導致很多丑陋的演員。
b.nothing()
的實現不應該關心誰在調用他。 如果你重構A
並將調用b.nothing()
移動到其他類,會發生什么? 如果b.nothing()
突然停止工作,那將是相當令人驚訝的。
我不認為這在概念上有任何錯誤。
但是,為了使機制工作, b
需要知道A
哪個實例調用something()
。 為此, B
的構造函數或其nothing()
方法需要將A
引用作為參數。
例1:
public class B {
public void nothing(A a) {
...
a.something();
...
}
}
例2:
public class B {
private final A a;
public B(A a) {
this.a = a;
}
public void nothing() {
...
this.a.something();
...
}
}
例3:
第三種方式適用於某些情況。 如果B
是A
的內部類,則它具有對其關聯的A
實例的隱式引用。
public class A {
public void something() { ... }
public class B {
public void nothing() {
...
something();
...
}
}
}
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()
這是尚未完全初始化的對象-它的構造還沒有執行完畢。 這有時會導致不良和難以診斷的行為。
要做到這一點, b
將需要引用a
。 有兩種方法可以提供:
B
的構造函數中傳遞這樣的引用或給B
一個合適的setter。 B
是A
的內部類,則它隱含地具有這樣的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.