我正在用Java設計一個遊戲引擎。Java:執行雙向鏈接對象
該引擎的核心存在兩個類Asset和Attribute,其中Asset包含一個Attributes列表。大多數屬性不需要鏈接備份到其屬性,這意味着屬性可以並經常出現在多個資產的列表中。但是,有一個名爲UniqueAttribute的屬性的擴展,它是針對那些特定於其資產的實現,並利用鏈接返回。
理想的情況下,我的資產的addAttribute方法會是這個樣子,如果我切出的其他代碼:
public void addAttribute(Attribute attribute){ if(attribute instanceof UniqueAttribute) ((UniqueAttribute)attribute).setAsset(this); attributeList.add(attribute); }
不幸的是,因爲他們生活在不同的包,UniqueAttribute.setAsset()必須是public 。這使得該方法對引擎的外部用戶開放以致於混亂,而我可以通過直接使用這種方法來手工關閉它,這是一個錯誤 - 它似乎相當sl。。
第二個選項是提供UniqueAttribute與建設的資產,這意味着在創建點的代碼看起來是這樣的:
asset.addAttribute(new UniqueAttribute(asset));
雖然我可以添加一個檢查 - 和 - 可投擲或斷言來確認正確的資產通過,我基本上依靠用戶來連接這兩個,我也不願意這樣做。
第三個選項是硬着頭皮,把50 java文件都到同一個軟件包,這樣我就可以使用標準的可視性。
是否有某種模式或什麼的,這將有助於鏈接這兩個在一起不暴露的電線,或迫使我把一切都變成一個巨大的包?
無關緊要的咆哮:我一直不喜歡java中的子包的概念並沒有真正以任何有意義的方式擴展。就Java而言,一個子包只是一個不同的包,並且我已經有很多場合可以使用更多與此直接相關的可見性修飾符。
可能選項2以某種廠是知道的獨特屬性和資產之間的關係? –
雖然我想有可能已經工作了子包的特殊規則,這是幾乎沒有必要(因爲你可以使用系統,如Spring或OSGi的執行接口和實現之間的距離),並會作出的事情非常複雜得多收益不大。簡單可靠的實現比「可愛」但複雜的功能更重要。 –