2010-04-08 105 views
1

我正在使用Java。我想要一個只能訪問另一個類的「擁有」對象的類的setter方法。我會更具體:Java後門接口,或者通過調用對象限制方法訪問

我有節點和端口接口。每個節點都有一組端口,每個端口都屬於一個節點。端口可以​​啓用或禁用,使用簡單的布爾屬性進行處理。但是,我只想讓「擁有」端口的節點設置其啓用/禁用屬性。這應該發生在Node.fixYourPorts()被調用時(OK,它有一個不同的名字,但我試圖簡化)。

所以,我希望大家能夠調用port.isEnabled(),但只有擁有節點應該能夠調用port.setEnabled()。

我能想到的幾個方法可以做到這一點,但我不知道這是最好的,我很擔心,我可能會考慮這個問題的錯誤的方式。想法而已:

  1. 每個節點的實現都需要在同一個包匹配的端口實現,並PortImpl.setEnabled()將包的訪問。不能保證一個節點不會改變另一個節點的端口,但這對我來說足夠接近。與任何可能獲得Port實例的隨機客戶端代碼相比,Node代碼更受我的控制。

  2. 相反編程到接口端口,程序到一個抽象基類,AbstractPort這是接口節點內部的靜態嵌套類。這個基類將提供setter方法,所以Node實現可以調用它。不知道這是否會起作用。

  3. 寫在這一切之上,該客戶端將無法捅另一個代碼層。將setEnabled添加到端口界面。頂層的代碼層將確保setter不會暴露。

  4. 將setter添加到接口。如果你作爲客戶端自己啓用或禁用一個端口,那麼你需要做好準備,讓事情無法正常工作。爲此添加評論。

這一切都因Node和Port實現將被持久化到使用Hibernate的數據庫而變得複雜。

任何幫助?

回答

4

您能否將Port公開給客戶端類,並使用提供setter方法的其他接口將其公開給Node對象?例如該組件構建它會創建一個(說)ConfigurablePort(延伸Port),並把它傳遞給Node,但通過端口返回給客戶端作爲一個單純的Port

interface ConfigurablePort extends Port { 
    void setValue(); 
} 

// in some factory... Or perhaps in the Node itself? 
public Port createPortForNode(Node node) { 
    ConfigurablePort port = new Port(); 
    node.setPort(port); // as Configurable 
    return port; // as immutable 
} 

所以你不擔心這裏約包裝的問題,您就不必執行方法的頭痛(即使拋出異常),您不希望。

+0

問題是,客戶端只是一個人從訪問中丟棄。但是,這仍然是一個改進,因爲客戶必須有意接觸設置者,而不是讓他們坐在那裏讓他們使用。嗯.... – 2010-04-08 16:39:46

+0

@Michael請注意,'ConfigurablePort'是封裝私有的,因此沒有人可以在該包之外實際向下轉發。 – 2010-04-08 21:15:54

+0

@佩特啊是的,我現在看到了。有點像我的#1,除了你製作一個包 - 私有接口而不是包私有方法。這有助於... – 2010-04-09 00:44:12

1

對於應具有較低訪問權限的Port用戶,請使用僅提供某些方法的接口公開該對象。

相關問題