Java內部類:如何在內部類中返回外部類對象

來源:互聯網
上載者:User

Nasted Class 的介紹,請詳見參考

今天討論的不是不是內部類的概念,而是具體使用的一個情境-如何在內部類中返回外部對象

(孤豬:我在程式裡也碰到過一次這樣的狀況,非靜態內部類可以直接調用外部類執行個體的成員變數,但如何引用外部類的執行個體本身卻成了一個問題,下面的這個方法正好解決了這個問題。見下面那句紅色的代碼。)

看一段代碼

import java.util.LinkedList;
import java.util.List;

public class OuterClass
{

 private List listeners = new LinkedList();

 public void addListeners(IListener listener)
 {
  this.listeners.add(listener);
 }

 
 private OuterClass outer = this;  (1)

 private class InnterClass
 {
  public void publish()
  {
   //將事件發布出去 (2)
   for(int i=0;i < listeners.size();i++)
   {
    IListener listener = (IListener) listeners.get(i);
    listener.receiveEvent(outer);
   }
  }
 }

 public void execute()
 {
  InnterClass in = new InnterClass(); (3)
  in.publish();
 }
}

public interface IListener
{

public void receiveEvent(OuterClass obj);
}

你可能覺得這個例子很彆扭,在哪裡讓你覺得難受呢?其實問題的關鍵就在於介面IListener的定義,這裡需要給receiveEvent方法傳遞的參數是外部對象!(別激動,下面我會說明需要傳遞的一個情境)

情境

在一個GUI系統中,我們要在畫板WorkSpace(WorkSpace實現了IListener介面)上產生一顆樹,但樹中的每個節點的產生(繪圖)是我們不知道的演算法,系統只為我們提供了一些繪圖的介面,並返回元素的控制代碼!看來我們需要"封裝"一下這個繪圖的控制代碼Brush(其實我把它叫做筆刷,因為它只知道如何"刷"出映像來,就這點本事!)並對外提供節點Node這樣一個通用的類。

此時Node與Brush的關係就很微妙了,不過我們可以拋開這些外表,看到Node與Brush其實就是外部類與內部類的關係!-第一步完成了:確定了兩者的關係

然而,事情沒有這麼簡單,Node類必須處理一些事件,而這些事件理所當然只有Brush能夠看懂,而Node根本不知道這樣的事件處理過程,現在有兩個辦法:辦法一,讓Node實現Brush所有的事件;辦法二,把Brush返回回去,讓它來處理自己的事件,看來辦法二是個好主意,因為我可以不關心事件的種類!-第二步完成了:確定了事件處理的責任

還沒完呢,你肯定不希望畫板WorkSpace面對的是繪圖的控制代碼Brush這樣的對象,相反你只希望WokSpace只知道Node的存在!IListener介面中receiveEvent方法的參數定義為OuterClass 就由此而來!-第三步完成:介面的定義

public interface IListener
{

public void receiveEvent(OuterClass obj);
}

 既然說清楚了這個問題(應該比較清楚了吧?)那改如何?這樣一個蹩腳而有無可奈何的設計呢?讓我們回憶一下內部類,內部類擁有訪問外部類的方法與屬性的許可權

 private OuterClass outer = this;  - 這個對外部類的引用就是為內部類的訪問準備的

 private class InnterClass
 {
  public void publish()
  {
   //將事件發布出去

   for(int i=0;i < listeners.size();i++)
   {
    IListener listener = (IListener) listeners.get(i);
    listener.receiveEvent(outer);  - 這裡不可以返回this,因為this代表的是內部類自己
   }
  }

 

參考

Java Nested class document.title="Java Nested class - "+document.title   http://blog.csdn.net/Killvin/archive/2006/01/10/574983.aspx

初識Java內部類 document.title="初識Java內部類 - "+document.title    http://blog.csdn.net/killvin/archive/2006/01/10/574991.aspx
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.