2012-09-24 120 views
6

匿名類和靜態內部類的最佳實踐(設計和性能明智)是什麼?內部/匿名類的最佳實踐

我個人認爲靜態內部類提供了更好的封裝,並且應該提供更好的性能,因爲他們沒有訪問類之外的最終化變量。但我從來沒有真正質疑過這一點。

我找到了一篇關於這個帖子的文章,但是我覺得它並沒有真正回答這個問題,只是人們對它的個人想法。

+0

沒有想過在這方面的表現。但設計:設計遵循功能。我想有些情景是靜態內部是「最佳實踐」,而其他人是匿名者。 – Fildor

+0

性能可能會忽略不計......但我對它有點好奇。 – David

回答

4

內部類(靜態或沒有)正是其封閉類的領域和方法,匿名類相同的訪問中,靜態內部類之間的區別(行爲ually調用嵌套類)和(常規,非靜態)內部類是靜態的需要顯式引用封閉類的實例來訪問某些東西。當然,當你需要這樣做時,它通常在創建內部類的封閉類的實例上,所以使用非靜態內部類更容易和更清晰。

實例:

  • 內部類(非靜態)

    class A { 
        private int field; 
    
        private class B { 
         public void doSomething() { 
          field++; // Valid 
         } 
        } 
    } 
    
  • 嵌套類(即, 「靜態內部類」)

    class A { 
        private int field; 
    
        private static class B { 
         public void doSomething(A a) { 
          a.field++; // Valid 
         } 
        } 
    } 
    
  • 匿名類

    class A { 
        private int field; 
    
        public void doSomething() { 
         new Runnable() { 
          @Override 
          public void run() { 
           field++; // Valid 
          } 
         } 
        } 
    } 
    

是否使用可訪問性是另一個問題。如果您訪問封閉類的私有字段,將會生成一個訪問者,因此它可能會影響性能,因爲調用方法的成本與訪問字段的成本不同,但它可能會忽略不計在大多數情況下。在進行基於任何測量的微優化之前,您應該始終先編寫正確的代碼(無論是在設計和功能方面)。無論如何,JIT編譯器會爲你做很多事情。

+1

+1:...先寫正確的代碼... – Jayan

+0

沒有靜態內部類,因爲它們無權訪問父類成員(即非靜態成員將無法從靜態上下文訪問)。我們稱這些是靜態嵌套類,像頂級或獨立類一樣工作。 –

+0

@LeninkumarKoppoju事實上,他們被稱爲嵌套類,後來我學到了正確的名字。我會更新答案。然而,嵌套類可以訪問封閉類的任何成員,如果它具有對該類的一個實例的引用:'outer.privateInt = 42;'作品,這對另一個頂級類是不可能的。 –

1

有Java源代碼的集合和模式有樣品(他們是在JDK目錄下的src.zip的樣子。在Eclipse中,你可以閱讀內嵌幫助

代碼讀一本書Effective Java,看對於內部類瞭解如何工作staticinner和其他有用的interfaceenum和其它類

+0

@ cl-r:它看起來像原始鏈接違反了版權。我用amazone鏈接替換它 – Jayan

+0

@Jayan,謝謝,我不知道這個問題。 –

+0

很久以前,我看到這本書...想想我會重溫它:) – David