Num*_*ron 10 java reference unique hyperlink
我正在用Java设计一个游戏引擎.
这个引擎的核心是两个类Asset和Attribute,其中Asset有一个Attributes列表.大多数属性不需要链接回其属性,这意味着属性可以并且经常出现在多个资产的列表中.但是,有一个名为UniqueAttribute的Attribute扩展,它是特定于其Asset的那些实现,并使用链接返回.
理想情况下,如果我删除其他代码,我的Asset的addAttribute方法看起来像这样:
public void addAttribute(Attribute attribute){
if(attribute instanceof UniqueAttribute)
((UniqueAttribute)attribute).setAsset(this);
attributeList.add(attribute);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于它们位于不同的包中,因此UniqueAttribute.setAsset()必须是公共的.这使得该方法对引擎的外部用户开放,并且虽然我可以通过直接使用这种方法来解决它是一个错误 - 它似乎相当草率.
第二个选项是在构造时为UniqueAttribute提供Asset,这意味着创建时的代码看起来像这样:
asset.addAttribute(new UniqueAttribute(asset));
Run Code Online (Sandbox Code Playgroud)
虽然我可以添加check-and-throwable或assert来确认传入了正确的资产,但我基本上依赖于用户连接这两者,我也不愿意这样做.
第三种选择是咬住子弹并将50个java文件全部放入同一个包中,这样我就可以使用标准的可见性.
是否有某种图案或某种东西可以帮助将这两者联系在一起而不会暴露电线,或者迫使我将所有东西都放入一个大包装中?
不相关的咆哮:我一直不喜欢java中的子包的概念并没有真正以任何有意义的方式扩展.就java而言,一个子包只是一个不同的包,并且在很多情况下我可以使用与此直接相关的更多可见性修饰符.
我的建议是 Asset、Attribute 和 UniqueAttribute 都应该位于同一个包中(可能与其他一些核心“引擎”类一起)。然后,您可以对 UniqueAttribute.setAsset 使用标准包可见性。
您不需要将所有其他类放在同一个包中 - 您的 Asset.addAttribute 方法应该是公共的并且可以从其他包访问,以便应用程序的其余部分可以直接使用它。
因此,该解决方案在您的分类中可以称为“ 3- ”。
作为一些更普遍的观点,还请考虑: