Java:强制双向链接的对象

前端之家收集整理的这篇文章主要介绍了Java:强制双向链接的对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 Java中设计一个游戏引擎.

在这个引擎的核心是存在两类资产和属性,其中资产有一个属性列表.大多数属性不需要链接到其属性,这意味着属性可以并且经常出现在多个资产的列表中.然而,有一个称为UniqueAttribute的Attribute的扩展,它是针对其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));

虽然我可以添加一个可检查的或可以断言来确认正确的资产被传入,但我基本上是依靠用户来连接这两个,我也不愿意这样做.
>第三个选项是咬住子弹,并将50个java文件全部放入同一个包中,以便我可以使用标准的可见性.

有没有什么样的图案或东西可以帮助这两个人联系在一起,而不会暴露电线,或者迫使我把所有东西放在一个大包装中?

不相关的咆哮:我一直不喜欢java中的子包的概念没有以任何有意义的方式扩展.就java而言,一个子包就是一个不同的包,并且有很多场合可以用与这个直接相关的更多的可见性修饰符来做.

解决方法

我的建议是资产,属性和UniqueAttribute都应该在同一个包中(可能还有一些其他核心的“引擎”类).然后可以使用UniqueAttribute.setAsset的标准包可见性.

您不需要将所有其他类放在同一个软件包中 – 您的Asset.addAttribute方法应该是公开的,并且可以从其他软件包访问,所以其他应用程序只能直接使用它们.

所以解决方案可以在你的分类中称为“3-”.

作为一些更一般的观点,还要考虑:

>无论你真的需要复杂的Attributes和UniqueAttributes – 我不确定你真的做了,以前实现了一个相当复杂的游戏对象模型,而不需要任何看起来像UniqueAttribute.如果UniqueAttribute“需要一个链接”,那么也许它试图太聪明/太多了?>即使你确实需要这两个,你真的想编写代码,它们以相同的方式/作为同一个对象的一部分来进行对待.他们似乎在概念上有所不同,如果你把两个人混合在一起,你最终会写出很多条件代码>属性的各种其他优点始终是共享的和不变的 – 它更适合内存使用,并发和可测试性.而且由于它们可能相当小,所以在需要的情况下,写时复制语义的代价是微不足道的.

原文链接:https://www.f2er.com/java/125731.html

猜你在找的Java相关文章