2012-07-04 75 views
2

假設我有一個叫做Factory的類。我打算讓該課程可公開訪問,以便任何人都可以創建並訪問factory。我希望工廠創建和分銷widgets。我只希望工廠能夠創建widgets,而不是公共計劃空間中的任何人。不過,我想要一個名爲distribute()的方法,它會向主程序發出widget。此時主程序可以訪問該widget的所有公共方法。如果需要的話,它也可以將其返回工廠,從而消除對該對象的任何公共訪問。Java中的一個類可以控制另一個類中的對象嗎?

如果這是可能的,一個人怎麼做到這一點?

回答

4

你在找什麼是內在的課堂。通過聲明內部類的構造函數是私有的,只有封裝類可以訪問它!然後,在外部類中創建一個工廠方法來構建小部件並分發它。我在這裏宣佈它爲static,但這不是必需的,這取決於您的需求。

public class Factory { 

    public static Widget buildWidget() { 
    Widget widget = new Widget(); 
    return widget; 
    } 

    public class Widget { 
    private Widget() { ... } 
    public void someMethod() { ... } 
    } 
} 

請注意,在乾淨的代碼中,您的其他問題必須通過注意您的參照完整性來解決。爲了「返還」小部件,必須釋放所有其他對它的引用。你的工廠肯定會跟蹤它發出的小部件,但很難可靠地「召回」小部件。

+0

有沒有一種方法可以讓內部類保持在它自己的獨立文件/類中?如果我的內部類變得很大,是否必須全部保存在同一個文件中,還是有辦法將其分解到另一個文件以便於管理? – WildBill

+0

否;如果你希望A類以這種方式嚴格控制B類,那麼你需要使它成爲一個內部類,它只能在該類中發生。 (儘管你可以寫一個薄包裝,但我想你應該小心*爲什麼*你想要做這些事情。做這件事的動機可能更自然地告訴另一個設計。 –

1

您正在描述隨時間而改變的訪問控制(「如果需要,它也可以將其返回工廠,從而刪除對該對象的任何公共訪問權限。」)。 Java不會那樣工作。所有的訪問限定符都是靜態檢查的,並且在程序的整個生命週期內保持不變。

+0

我認爲你對這個問題的誤解(不可否認)是錯誤的。如果所有引用都被釋放,那麼沒有人可以訪問該對象,也可以不使用公共方法。 OP可能不完全理解它如何與Java協同工作,或者誇大顯而易見,但這並不是不可能的。 –

+0

很可能是我誤解了需求。我發現程序中的訪問控制一般都是編程語言的一個愚蠢的特性。 –

0

將小部件放在與工廠相同的包中,並將小部件的構造函數設置爲受保護的可見性。這將限制對象到工廠的創建。

對於每個小部件,可以部分實現訪問控制。您可以在允許訪問的對象的每個小部件中保留一個List,並且只有工廠可以修改此列表(受保護的可見性)。對於所有公共函數,您需要用戶傳入一個已被授權訪問小部件功能的對象。您可以通過將授權的對象傳回工廠來返回對象,以便它將刪除授權。

您可以在主類中傳遞一個私有對象作爲授權對象 - 這將阻止其他類使用該小部件。不過,這並不妨礙其他班級要求授權。

這有點片狀,因爲你可能忘記釋放授權並使用「不死對象」(除了小部件中的訪問控制列表以外的任何地方除外)使小部件變得雜亂無章。

+0

如果'默認'表示'保護',它仍然允許同一包中的任何類訪問控件。此外,您建議的控制模式對系統來說是非常重要的,並且容易引發錯誤。 –

+0

@NathanielFord:控制模式是強制它工作的一種方式,所以預計會有開銷。我承認我沒有想過所有的事情,所以可能會有很多我錯過的例子。我同意這種可見度可以放寬到「受保護」。 – nhahtdh

相關問題