2013-08-23 109 views
32

如果我有例如一個類和一個輔助類來完成它的一些功能,那麼把它作爲一個內部類是否有意義。什麼時候在Java中使用幫助類的內部類

public class Foo { 
     private FooHelper helper; 

     // constructor & any other logic 

     public void doSomeThing() { 
     helper.do(); 
     } 
    } 

    public class FooHelper { 
     public void do() { 
     // code 
     } 
    } 

在上述情況下是否有意義使FooHelper作爲一個內部類?道歉,如果這聽起來很愚蠢,但我對使用案例有點困惑。

+0

http://javabeginnerstutorial.com/core-java-tutorial/inner-class/ –

+1

一般用於行動人員,以及何時不想將您的電話公開給他人。 –

+0

@Vaibhav Jain感謝您的鏈接,我知道的語法,但有點混淆什麼時候使用它,如果有任何交易 – Hild

回答

41

是的,讓它成爲內心階層是非常合理的。如果沒有其他類需要它,請將其設爲私有。如果它不需要對外部類的成員進行獨佔訪問,則將其設置爲靜態嵌套類,因爲那樣它將需要較少的內存空間。

退房從the official tutorial推薦 -

,如果你需要訪問 一個類實例的非公共字段和方法使用非靜態嵌套類(或內部類)。如果您不需要此訪問權限,請使用靜態的 嵌套類。

+0

什麼時候應該是一個靜態的內部類?如果從功能上看有什麼不同? – Hild

+4

@Hild:「靜態嵌套類」不能訪問封閉類的成員(除非它是靜態的)。如果這符合您的要求,請將其設爲靜態。另一方面,非靜態的內部類可以完全訪問封閉類的成員。 –

+0

@Hild靜態嵌套類不包含對其封閉類的合成引用。所以除非你有特定的理由使其成爲非靜態的,否則總是努力使它成爲一個「靜態嵌套類」。 「靜態內部類」是一個技術上錯誤的術語。 – Geek

10

如果你認爲FooHelper根本不會被其他類比Foo有用,話很有道理,使其作爲private內部類的Foo。這種設計的一個例子可以在HashMap中找到,其中它定義了一個私有的內部類KeySet

否則將它作爲private實例看起來不錯。

1

當內部類很小且不需要名稱時,內部類就有意義。 GUI中的聽衆是有意義的典型例子。

如果這個類很重要,它應該被命名並放置在一個單獨的文件中。

正常的GUI示例中的監聽器類只做一件小事,通常只是調度到某個其他函數來完成實際工作。

我也經常使用靜態嵌套類(這在技術上不是內部類)只用於其他類的上下文中的類 - Map.Entry就是一個很好的例子。它只能與Map結合使用,因此將Entry的定義作爲Map接口的一部分會使組織更具意義。

對於其他類型的嵌套類,如非靜態成員類和本地類,我一般不會有太多用處。但他們偶爾會有用。有關成員類的合法用法的一個很好的例子,請參閱LinkedList.ListItr的源代碼。這是一個私人內部類,其目的是爲LinkedList提供ListIterator的實現。爲此,有權訪問LinkedList中的私有數據。要僅使用頂級類來實現此目的,就必須在LinkedList中公開更多公共方法,以允許ListIterator獲取LinkedList的底層實現。相反,使用內部類允許LinkedList保持私有化,因爲它應該是。

+0

對不起,我是一個永遠的新手,並且想要一個解釋,因爲我看不到OOP世界中的innerclases的地方: 他們可以訪問**外部類的私人**成員... 您不能重複使用它們,只能通過複製粘貼... 使代碼變得醜陋,並且更難以閱讀和保留...(續) – inigoD

+0

I只有理解你在優化應用程序時不暴露很多公共方法的觀點,但不能在GUI中看到什麼是感覺:監聽器模式使您可以選擇更改項目行爲(在按鈕'onclick'事件中要做什麼,例如)在執行時間。如果監聽器是一個內部類,它通常表示你確實不需要監聽器功能:你想要一個'onClick'方法,你永遠不會重用(就像通常在android中發生的一樣) – inigoD

+0

@eddieferetro我能想到的一個用例當它被用於特定的類時,它不會暴露整個對象。 – Hild

0

是的,使用內部類的好處是它可以訪問外部類的成員。在你的情況下,如果你認爲你的FooHelper不會被任何其他類使用,你可以使它成爲一個內部類。

要檢查內部類的效用,請通過AWT的示例。匿名內部類在事件處理程序中被廣泛使用。

0

什麼是Foo的範圍?當Foodomain model class與它自己的生命週期和helper是共同的服務,似乎混合兩個對象具有非常不同的範圍/生命週期。

通常,域實體具有從創建,持久到GC的自己的生命週期。另一方面,幫助者或服務是靜態的或更好的動態,其生命週期等於整個應用,例如,春豆。

一旦你的域實體包含一個服務的引用,它會給你帶來嚴重的問題。例如。每次調用存儲庫的Get都需要將此服務的引用注入到域實體中。我建議避免這種模式。

對於我來說,對於你來說Helper的實例並不明顯。

4

以下是內部類的一些用法。

  • 內部類用於獲取功能,可以獲取比方法更好的對象。
  • 它們可以用於需要一組多重操作的情況,以及班級內可重複使用的機會很好,並且他們在班級以外沒有用處。
  • 內部類也可以實現多重繼承。
  • 內部類在類上下文中有用時使用。
  • 它們被用來分隔類內的邏輯。

所以如果你有一些需求匹配上面的點比內部類可以使用。讓內部類private防止從其他類訪問總是更好。在你的情況下,使用內部類有助於在類中使代碼可讀和分離邏輯。

0

Hild,是的,在很多情況下使用內部類是有意義的。

想想這樣 - 內部類將與外部類生活和死亡,因此外部類特別需要的任何功能都可以添加到內部類中。 受歡迎的示例是 - 大多數情況下的監聽器 - KeyListeners,MouseListeners,eventListeners的類型。

Java中的類允許您具有特定的功能,但有時您可能需要具有單獨的專用功能,但它也需要與您正在設計的類緊密聯繫。

可以有四種類型的內部類。簡單的谷歌搜索可以幫助您瞭解更多關於它們的信息。

0

有兩個附加類型的內部類的。你可以在方法體內聲明一個內部類。這些類被稱爲本地類。你也可以在方法體內聲明一個內部類而不用命名該類。這些類被稱爲匿名類。

本地類:如果您需要創建一個以上的類實例,訪問其構造函數或引入一個新的命名類型(例如,因爲您需要稍後調用其他方法),請使用它。

匿名類:如果您需要聲明字段或其他方法,請使用它。

0

何時使用內部類?

  1. 內部類不需要任何額外的或單獨的文件放置。
  2. 內部類比較小,與「父」類或「外」類緊密結合。 避免了許多幫助類,並適合解釋遏制的OOD原理。
  3. 同一文件中的所有代碼都增加了可讀性並提高了性能(如在線代碼)。它們在編碼中的重要性日益增加,並被視爲一種良好的做法。
  4. 當您想要動態定義回調 時,匿名內部類非常有用。
  5. 內部類的對象可以訪問創建它的對象 的實現 - 包括私有數據。
6

從Java SE文檔

爲什麼要使用嵌套類?

它的邏輯分組那些只在一個地方使用的類的方式:如果一個類只有一個其他類有用的,那麼它是邏輯將其嵌入在該類中,並保持兩者結合起來。嵌套這樣的「幫助類」使得它們的包更加簡化。

它增加了封裝:考慮兩個頂級類A和B,其中B需要訪問A的成員,否則這些成員將被聲明爲私有。通過在類A中隱藏類B,可以將A的成員聲明爲私有,並且B可以訪問它們。另外,B本身可以被外界隱藏起來。

因此,使用FooHelper作爲內部類是有意義的。

相關問題