2010-09-21 27 views
4

我有很多存儲在ContainingClass類型的對象中的ContainedClass類型的對象。我需要從內部對象訪問容器對象。到目前爲止,我通過在其他對象(如ContainedClass cclass = new ContainedClass(this);)的構造函數中傳遞容器對象的引用並將其存儲爲ContainingClass owner來完成此操作。在Java中使用大型內部類是不好的?

這對我來說似乎很難看,似乎適合我的解決方案是使用內部類,但ContainedClass的定義非常大,而且看起來不合適。那麼我應該選擇哪個選項?還是有另一個顯而易見的選擇,我錯過了?

這是我在網上找到的一段示例代碼,描述了我將要使用內部類的內容。

public class TestIt { 
    public static void main(String a[]){ 
    new TestIt().doit(); 
    /* 
     output : 
     Hello world! 
    */ 
    } 
    public void doit() { 
     new InnerClass().sayHello(); 
    } 
    public void enclosingClassMethod(){ 
     System.out.println("Hello world!"); 
    } 


class InnerClass { 
    public void sayHello() { 
    TestIt.this.enclosingClassMethod(); 
    } 
} 
} 

我要補充的是內部類的其他利益,我看是ContainedClass只能在ContainerClass存在,這是一個理想的結果。

+0

注意的*內部類*和*靜態內部類*之間的差異。雖然兩者都駐留在外部類的命名範圍內,但非靜態內部類類型的對象會攜帶對外部類類型的對象的隱式引用。 – 2010-09-21 22:57:14

+1

由於您使用的示例代碼不是您正在使用的代碼,因此我們正在討論* code *的代碼行數?包含的類有多少個,包含的有多少個? – 2010-09-21 23:04:54

回答

2

我認爲這取決於父母/孩子班級的高度耦合程度。如果孩子需要訪問許多成員變量,否則這些成員變量不會通過getter/setter或許多其他私有成員函數公開,那麼內部類的安排將會更加清晰。

但是,如果子類將使用父級的現有公共接口,那麼我認爲將它們分開會更清晰。向構造函數添加一個額外的參數並不錯。您甚至可以引入一個接口來描述父級的哪些部分是從子級訪問的。這使得單元測試獨立於父類的子類變得容易(例如使用模擬對象)。

+0

我喜歡使用內部類的主要原因是我可以將所有內容組合成一個類。這樣,當只需要這些功能和類別相互關聯時,我就不會有公共功能和外部類。 – Kyle 2010-09-22 01:22:46

3

你用你的ContainedClass cclass = new ContainedClass(this);構造完成的內容正是內部類所做的。可能有理由不使用內部類,但類的大小並不是真正的其中之一。除非有充分理由不使用真實交易,否則我會使用真實語言功能而不是模擬它。

0

如果我是你,我會堅持你之前做的事情,而不是轉換到內部類。它們的語法有時並不可怕(特別是因爲這不是一個靜態內部類,而是一個每個實例類),並且你只是要在一個文件中填充大量代碼。

您之前使用的父母/子女關係並不罕見,我個人認爲這並不醜陋。

1

我會用一個factoryMethod在這種情況下:

class ContainingClass { 
... 
    ContainedClass createContainedObject() { 
     return new ContainedClass(this); 
    } 
... 
} 

代碼它看起來像

jar = new ContainingClass(); 
bean = jar.createContainingClass(); 

這是一個有點側跨的問題,但我覺得它的表現力和允許我選擇是否使用內部類。我個人不喜歡大型的內部課程,我發現他們很難閱讀。

0

任何味道的大類通常應該被貶低,因爲他們往往有多重責任,是一個孤立和測試的痛苦。

您的解決方案最終將取決於爲什麼ContainedClass需要了解ContainerClass。如果意圖是在ContainedClass之間共享公共數據/初始化代碼,那麼Factory方法可能會產生良好的結果。或者,如果你只是想跟蹤你的ContainedClass,那麼你可能想考慮一個Event/EventListener模型。

0
  1. 內部類應該用於創建一次性對象。
  2. 如果只有頂級的類使用這個類,然後去內部類。
  3. 請閱讀Joshua Bloch的Effective Java,以獲得清晰的想法。
相關問題