我目前正在设计一个本质上非常分层的 API,因为大多数对象类型都是另一种类型的容器对象的父级。例如:
interface Parent {
Set<Child> getChildren();
Child createChild();
}
interface Child {
Parent getParent();
// other methods
}
但是,当将诸如 removeChild
之类的方法添加到 Parent
时,这种设计就会出现一些问题。当被调用时,子级与父级分离,有效地孤立它并使其过时。
但是,使用 API 的程序可能会保留对 Child
的引用,因此为了确保不会错误地调用任何方法,当前的设计认为,如果目标是孤立的,则 Child
定义的所有方法都会抛出 OrphanedObjectException
(扩展了 IllegalStateException
)。
我不确定这是最好的解决方案,所以我想知道是否有更好或更多的面向对象的方法来解决这个问题。
最佳答案
我认为这与其说是“等级制度”的问题,不如说是有效清理的问题。如果子级在从父级中移除后就不再存在,那么您需要确保它不再存在。删除 API 其他部分所持有的所有对它的引用。
实现此目的的一种方法是制作类似 ChildManager
的内容。该类跟踪需要被要求丢弃其对子级的引用的每个对象,以及 ChildConsumer
由使用 Child
的每个类实现的接口(interface)。像这样的东西:
class ChildManager {
private Child child = null;
public void register(Child child);
public void unregister(Child child);
public Child consume(ChildConsumer consumer);
}
interface ChildConsumer {
public void releaseChild(Child child);
}
现在是Parent
持有ChildManager
。每次它获得一个 child 时,它都会调用 register
。每当另一个对象需要访问其中一个子对象时,它就会调用 consume
,并且它必须实现releaseChild
这样它在被消耗后就不再有对该子项的引用。现在Parent
负责调用unregister
期间remove
,和unregister
来电 releaseChild
对于每一位消费者,确保Child
已完全删除。
从某种意义上说,感觉就像您正在重新实现引用计数,但最好设计一个系统 OrphanedObjectException
在我看来,并没有隐藏在您的每一个方法调用之下。
另一个解决方案可能是传递 WeakReference<Child>
对于每个拥有可能孤立的 Child
的对象并检查 null
每次您调用get
。这可以让您免于 OrphanedObjectException
。这看起来更自然,更符合 Java 风格,但是为 null
创建了很多难看的检查。分散在您的代码中。
关于java - 逻辑孤立对象的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31999615/