簡體   English   中英

從實例調用方法

[英]Call method from instance

假設我有兩個類, AB ,反過來有一些方法, 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:

第三種方式適用於某些情況。 如果BA的內部類,則它具有對其關聯的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 有兩種方法可以提供:

  1. B的構造函數中傳遞這樣的引用或給B一個合適的setter。
  2. 如果BA的內部類,則它隱含地具有這樣的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM