亚洲av色香蕉一区二区三区,十四以下岁毛片带血a级,亚洲 校园 欧美 国产 另类,亚洲av日韩av一区谷露,色欲av无码一区二区三区

  • 相關(guān)軟件
    >So what are inner classes good for anyway?(翻譯 by Gee) 創(chuàng)建者:webmaster 更新時(shí)間:2005-05-16 21:36

    Q:其實(shí)內(nèi)部類有什么好處呢?



    A:不管怎么說,內(nèi)部類的存在有著它的長(zhǎng)處。在我們開始探討之前,讓我來簡(jiǎn)單地介紹一下內(nèi)部類的來由。



        內(nèi)部類就是嵌套在另一個(gè)類的里面的類。一個(gè)一般的類是package的直接成員,也就是最頂層的類,而內(nèi)部類就是在jdk1.1就出現(xiàn)的概念,它主要分成四類:



    1、 靜態(tài)內(nèi)部類



    2、 一般內(nèi)部類

    3、 局部類

    4、 匿名類

    讓我按次序來簡(jiǎn)單認(rèn)識(shí)一下吧

    簡(jiǎn)短地說,靜態(tài)內(nèi)部類也就是一個(gè)一般類的一個(gè)靜態(tài)成員。像其他的靜態(tài)方法一樣,靜態(tài)內(nèi)部類可以訪問頂層類的所有靜態(tài)方法。

    像靜態(tài)內(nèi)部類一樣,一般內(nèi)部類也是扮演著一般類的一個(gè)內(nèi)部成員。但它不像靜態(tài)內(nèi)部類,一般內(nèi)部類需要聲明實(shí)例化,可以訪問所有的成員和方法,甚至可以通過訪問this這個(gè)reference訪問頂層類的成員和方法。

    局部類就是在一些語句塊內(nèi)聲明和只能在語句塊內(nèi)才可以看到的類,就好像方法內(nèi)的局部變量一樣。

    最后是匿名類,他也就是一個(gè)沒有名字的局部類。

    為了更明確的解答你的問題,我會(huì)把著重點(diǎn)放到你將會(huì)遇到的或者用上的一般內(nèi)部類和匿名類。從我的角度來說,內(nèi)部類的好處可以分成三個(gè)類別:在面向?qū)ο笊系暮锰?、在組織結(jié)構(gòu)上好處和回調(diào)的好處。

    在面向?qū)ο笊系暮锰?br />


    以我的淺陋的認(rèn)識(shí)來看,內(nèi)部類最重要的特點(diǎn)就是允許我們把一些東西放到對(duì)象里面去,因?yàn)檎G闆r下我們一般不會(huì)這樣做的。與如果沒有內(nèi)部類的出現(xiàn)相比,內(nèi)部類這樣的特點(diǎn)讓我們的代碼更加符合面向?qū)ο蟮乃枷搿?br />
    讓我們來看一下一般內(nèi)部類,自從它的實(shí)例對(duì)象成為父實(shí)例對(duì)象的一個(gè)成員部分后,它可以訪問父實(shí)例對(duì)象的所有成員屬性和方法。乍眼看去,這好像不大像;但實(shí)際上我們已經(jīng)訪問了父實(shí)例對(duì)象內(nèi)的方法了。然而內(nèi)部類又允許我們?cè)谶壿嬌蠌母笇?shí)例對(duì)象中分離出來并具體化它。舉個(gè)例子,一個(gè)樹類,可能有一個(gè)方法或者許多輔助方法來實(shí)現(xiàn)這棵樹的搜索或者遍歷。從面對(duì)對(duì)象的觀點(diǎn)來看,樹類就是一棵樹,不是一個(gè)搜索算法。但你要完成一個(gè)樹的搜索操作,就必須和這棵樹的數(shù)據(jù)結(jié)構(gòu)有一個(gè)密切的關(guān)系。

    一個(gè)內(nèi)部類就是可以把這些邏輯去掉并把它們封裝成一個(gè)自己的類。所以從面向?qū)ο蟮挠^點(diǎn)來說,我們已經(jīng)把那些不屬于該類的功能性的東西封裝成一個(gè)自己的類。通過應(yīng)用內(nèi)部類,我們成功地把其搜索算法從樹類中分離出來。那么現(xiàn)在,假如我們要改變搜索算法,我們就簡(jiǎn)單地替換這個(gè)內(nèi)部類就可以了。而內(nèi)部類在面向?qū)ο笊系暮锰幘驼f到這里了,其實(shí)我可以繼續(xù)說下去,但這樣會(huì)不斷擴(kuò)展地展示代碼中面向?qū)ο蠹夹g(shù)帶來的好處。

    組織結(jié)構(gòu)上的好處



    面向?qū)ο笤O(shè)計(jì)并不是適合所有的東西的,但幸運(yùn)的是,內(nèi)部類還提供了其他更多的好處。從組織結(jié)構(gòu)上的觀點(diǎn)來看,內(nèi)部類允許我們通過運(yùn)用命名空間來更深層次地組織我們的包結(jié)構(gòu)。類與類之間可以更深層次的嵌套,讓層次結(jié)構(gòu)更清晰,取代了這些類一籮筐似的倒在同一層次的包里面。顯而易見,如果沒有內(nèi)部類,我們會(huì)局限于下面的層次結(jié)構(gòu):



    package1
      class 1
        class 2
        ...
        class n
    ...
    package n



    但如果有內(nèi)部類,我們就可以實(shí)現(xiàn)一下這樣:



    package 1
      class 1
      class 2
        class 1
        class 2
        ...
        class n



    只要我們能夠適當(dāng)?shù)剡\(yùn)用,內(nèi)部類會(huì)讓我們的類具有更自然的層次結(jié)構(gòu)。







    回調(diào)上的好處



    一般內(nèi)部類和匿名類提供給我們一個(gè)方便的方法來定義回調(diào)。最典型的例子就是GUI代碼上的應(yīng)用。但是,應(yīng)用程序上的回調(diào)可以擴(kuò)展到很多域中去。



    大部分的Java GUIs都有一些組件響應(yīng)actionPerformed()方法調(diào)用。不幸地是,大部分的開發(fā)人員只是簡(jiǎn)單地在他們的主窗口的程序上實(shí)現(xiàn)ActionListener。結(jié)果所有的組件都共享這個(gè)actionPerformed()方法。要想指出哪個(gè)組件去實(shí)現(xiàn)動(dòng)作,actionPerformed()方法不僅篇幅大,而且代碼中還要存在難讀的switch語句。



    這里有個(gè)關(guān)于單片電路實(shí)現(xiàn)的例子:



    public class SomeGUI extends JFrame implements ActionListener
    {
      protected JButton button1;
      protected JButton button2;
      ...
      protected JButton buttonN;

      public void actionPerformed(ActionEvent e)
      {
        if(e.getSource()==button1)
        {
          // do something
          }
        else if(e.getSource()==button2)
        {
          ... you get the picture



    無論什么時(shí)候,當(dāng)你看到多個(gè)switch或者大篇幅的if/if else的代碼塊,你就應(yīng)該在腦袋中敲起警鐘??偟膩碚f,這些結(jié)構(gòu)都是不好的面向?qū)ο蟮脑O(shè)計(jì),一旦代碼中一個(gè)部分改變了就要在switch條件中做出相應(yīng)的修改。而一般內(nèi)部類和匿名類就可以讓我們擺脫多個(gè)switch條件的actionPerformed()方法。



    事實(shí)上,我們可以為需要監(jiān)聽的每個(gè)組件定義一個(gè)內(nèi)部類去實(shí)現(xiàn)ActionListener,當(dāng)然這樣會(huì)導(dǎo)致很多個(gè)內(nèi)部類,但我們可以避免了多個(gè)switch條件語句和擁有了多個(gè)獨(dú)立封裝action邏輯帶來的靈活性。此外,這樣做也提高了程序性能。比如說多個(gè)switch條件語句中有n次比較,我們估算大概平均要n/2次地比較次數(shù)。而內(nèi)部類可以讓我們?cè)赼ction performer和action listener之間達(dá)到1:1的匹配對(duì)應(yīng)。在大型的GUI程序中,這樣的優(yōu)化工作對(duì)性能上的改進(jìn)會(huì)產(chǎn)生一個(gè)實(shí)質(zhì)性的影響。一個(gè)匿名類實(shí)現(xiàn)這種優(yōu)化寫法大概如下:



    public class SomeGUI extends JFrame
    {
      ... button member declarations ...

      protected void buildGUI()
      {
        button1 = new JButton();
        button2 = new JButton();
        ...

        button1.addActionListener(
          new java.awt.event.ActionListener()
          {
            public void actionPerformed(java.awt.event.ActionEvent e)
            {
              // do something
            }
          }
        );
        …repeat for each button







    如果應(yīng)用一般內(nèi)部類,程序就會(huì)像這樣:



    public class SomeGUI extends JFrame
    {
      ... button member declarations

      // inner class definitions
      class Button1Handler implements ActionListener
      {
        public void actionPerformed(ActionEvent e)
      {
          // do something
        }
      }
      ... define an inner member class for each button

      protected void buildGUI()
      {
        // initialize the buttons
        button1 = new JButton();
        button2 = new JButton();
        ...

        // register an inner class action listener instance
        // for each button
        button1.addActionListener(new Button1Handler());
        .. repeat for each button



    因?yàn)閮?nèi)部類可以訪問父類的所有東西,所以我們可以把單片電路程序中任意一個(gè)actionPerformed()方法的實(shí)現(xiàn)放到一個(gè)內(nèi)部類中去,以這種方式來移動(dòng)程序的邏輯塊。



    我個(gè)人比較偏向于應(yīng)用一般內(nèi)部類來實(shí)現(xiàn)回調(diào),但這只是個(gè)人的喜好。因?yàn)槲矣X得太多匿名類會(huì)混亂了代碼,同時(shí)如果匿名類超過兩句代碼,我就會(huì)覺得它比較笨拙。



    內(nèi)部類不足的地方



    沒有東西是十全十美的,一樣?xùn)|西有它的長(zhǎng)處必然會(huì)有它的短處。內(nèi)部類也有它們不足的地方。從維護(hù)的角度來說,一個(gè)不熟練的開發(fā)人員就會(huì)覺得內(nèi)部類難以理解。應(yīng)用內(nèi)部類會(huì)使增加你的類的代碼總行數(shù)。此外,從開發(fā)的角度來說,大部分的Java工具都在對(duì)內(nèi)部類的支持上都存在或多或少不足的地方。For example, I use IBM's VisualAge for Java for my day-to-day coding. While inner classes will compile within VisualAge, there is no inner class browser or template. Instead, you must simply type the inner class directly into the class definition. That unfortunately makes browsing the inner class difficult. It is also difficult to type since you lose many of VisualAge's code completion aids when you type into the class definition or use an inner class.

    For example, I use IBM's VisualAge for Java for my day-to-day coding. While inner classes will compile within VisualAge, there is no inner class browser or template. Instead, you must simply type the inner class directly into the class definition. That unfortunately makes browsing the inner class difficult. It is also difficult to type since you lose many of VisualAge's code completion aids when you type into the class definition or use an inner class.
    原文鏈接:

    http://www.javaworld.com/javaworld/javaqa/2000-03/02-qa-innerclass.html
    相關(guān)文章
    本頁查看次數(shù):