【发布时间】:2011-11-20 20:49:04
【问题描述】:
我正在用 Java 设计一个游戏引擎。
该引擎的核心存在两个类 Asset 和 Attribute,其中 Asset 具有属性列表。大多数属性不需要链接到它们的属性,这意味着属性可以并且经常出现在多个资产的列表中。但是,有一个属性扩展名为 UniqueAttribute,它是针对特定于其资产的那些实现,并利用返回链接。
-
理想情况下,如果我删掉其他代码,我的 Asset 的 addAttribute 方法会如下所示:
public void addAttribute(Attribute attribute){ if(attribute instanceof UniqueAttribute) ((UniqueAttribute)attribute).setAsset(this); attributeList.add(attribute); }不幸的是,由于它们存在于不同的包中,UniqueAttribute.setAsset() 必须是公共的。这使得该方法对引擎的外部用户开放,可以搞乱,虽然我可以直接说直接使用这种方法是一个错误,但我可以直接放弃它 - 这似乎相当草率。
-
第二个选项是在构造时为 UniqueAttribute 提供资产,这意味着创建时的代码将如下所示:
asset.addAttribute(new UniqueAttribute(asset));虽然我可以添加一个 check-and-throwable 或 assert 来确认传入了正确的资产,但我基本上是依靠用户来连接这两者,我也不希望这样做。
第三种选择是硬着头皮把 50 个 java 文件放在同一个包中,这样我就可以使用标准的可见性了。
是否有某种模式或某种东西可以帮助将这两者连接在一起而不会暴露电线,或者强迫我将所有东西都放在一个大包中?
无关紧要的咆哮:我一直不喜欢 java 中子包的概念没有真正以任何有意义的方式扩展。就 java 而言,子包只是一个不同的包,在很多情况下我可以使用更多与此直接相关的可见性修饰符。
【问题讨论】:
-
也许选项 2 带有某种了解独特属性和资产之间关系的工厂?
-
虽然我认为对子包有特殊规则可能会奏效,但几乎没有必要(因为您可以使用 Spring 或 OSGi 等系统来强制接口和实现之间的分离)并且会事情要复杂得多,收益却很少。一个简单、可靠的实现比一个“可爱”但复杂的功能更重要。
标签: java reference hyperlink unique