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

          Posted on 2006-03-02 20:49 killvin 閱讀(533) 評論(0)  編輯  收藏 所屬分類: java

          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(其實我把它叫做筆刷,因為它只知道如何"刷"出圖像來,就這點本事?。┎ν馓峁┕濣cNode這樣一個通用的類。

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

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

          還沒完呢,你肯定不希望畫板WorkSpace面對的是繪圖的句柄Brush這樣的對象,相反你只希望WokSpace只知道Node的存在!IListener接口中receiveEvent方法的參數定義為OuterClass 就由此而來?。?STRONG>第三步完成:接口的定義

          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   http://blog.csdn.net/Killvin/archive/2006/01/10/574983.aspx

          初識Java內部類    http://blog.csdn.net/killvin/archive/2006/01/10/574991.aspx

          主站蜘蛛池模板: 延庆县| 丹江口市| 洪湖市| 来凤县| 合水县| 右玉县| 绩溪县| 延寿县| 南陵县| 扶余县| 绥芬河市| 衢州市| 南皮县| 格尔木市| 沐川县| 荥阳市| 策勒县| 马鞍山市| 教育| 全州县| 安图县| 台南县| 瑞昌市| 会泽县| 建湖县| 德江县| 宣城市| 修文县| 封丘县| 黄平县| 合作市| 河东区| 安泽县| 福清市| 凤冈县| 汉川市| 衡阳县| 北票市| 察隅县| 禹州市| 武乡县|