2013-04-18 30 views
12

在java中,您可以擁有內部類。如果對此有任何好處,我從設計角度感到好奇。Java內部類設計利潤

我最初的想法是,與類分開的文件是更清潔的東西分成可重用的模塊。通過這樣做,如果其他類想要使用其他類,他們也可以創建自己的實例。對我來說,似乎避免內部類可能是一個更好的可擴展性和代碼重用設計,並且在處理新項目時,通常很難判斷類是否會被重用......所以我覺得有必要單獨的課程是要走的路。

我問這個問題,因爲我接管了一個項目,其中有一堆......這讓我覺得以前的開發人員可能只是懶惰或不熟悉IDE。但我想確保我不會錯過這些內部類的任何好處。如果有人可以讓我知道,那麼我可以確認以前的開發人員是否正在利用這些好處。

+2

你真的指內部類或[靜態]嵌套類嗎? –

+1

首先,內部類可以訪問外部類的成員,所以有時它可以幫助對象/類封裝(避免不必要的getter和setter)。 – kamituel

+0

他們在做內部類,但我也歡迎任何有關靜態嵌套類的評論。 –

回答

12

當它們不在包含類之外使用時,內部類很好 - 這是減少類膨脹的一種方法。作爲一般規則,這是我唯一使用它們的時間。

非靜態內部類還可以訪問包含實例的私有字段。

+0

我喜歡關於class bloat的評論。我碰到的問題是一個文件似乎有10個這樣的文件,所以這個文件很長,我發現把這些文件分開似乎讓我更容易閱讀... –

+0

測試是否有任何好處或不利因素? –

+0

我對「Effective Java」的閱讀確認了您的意見。謝謝! –

2

內部類是有用的:

  1. 隱藏實現細節。

  2. 使項目視圖更加簡潔,從而可以理解。

  3. 添加相關代碼的邏輯分組。即進入我的腦海內部類的

1

一個很好的用法是在java.util.ArrayList隱藏它的迭代器實現到private inner classes。除了通過在列表對象上調用iterator()listIterator()之外,您無法創建它們。

通過這種方式,ArrayListIteratorListIterator實現爲了增強可讀性(實現非常短)而與其相關的類和方法分組在一起,但對其他人隱藏。

它們不能被聲明爲static,因爲它們需要訪問其封閉的實例對象。

public class ArrayList<E> extends AbstractList<E> 
     implements List<E>, RandomAccess, Cloneable, java.io.Serializable { 
    ... 
    public Iterator<E> iterator() { 
     return new Itr(); 
    } 

    private class Itr implements Iterator<E> { 
    ... 
    } 

    public ListIterator<E> listIterator() { 
     return new ListItr(0); 
    } 

    private class ListItr extends Itr implements ListIterator<E> { 
    ... 
    } 
} 
1

非靜態內部類:
1)內的類將被用於在外部類執行一些任務,並返回輸出
。所以它將確保創建外部類對象來訪問它。
2)內部類只針對外部類而不用外部世界。所以不需要考慮代碼重用。

例1)內部類的最佳示例是iterator集合框架的實現。 Set(AbstractCollection.java)和List(AbstractList.java)將使用不同的迭代器內部類實現。
- >我們可以重用內部類代碼。例如private class Itr內部類的實現在java.util.AbstractList由Arraylist和Vector使用。

靜態內部類:
1)靜態內部類將不依賴一個外部類對象上;但具體到外層級。它不會暴露於獨立,因爲它只針對外部類。所以沒有代碼重用。
2)它具有的基團的方法是常見的(共享),以所有的對象(類級) 3)

e.g_1)Sigleton對象retrival使用靜態內部類。
例2)構建器模式
例3)類的比較器實現。

0

內部類是非常重要的事情,它可以幫助您實現非常整潔的封裝需求,您的基類也可以繼承許多類(例如實現抽象處理程序)。每個程序員都可以學習如何在Java中使用內部類,這是非常有用的。