java - 逻辑孤立对象的替代方案

标签 java oop

我目前正在设计一个本质上非常分层的 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/

相关文章:

c# - 条件预订系统的最佳设计模式

asp.net-mvc-3 - 具有由多个类实现的接口(interface)的依赖注入(inject)

java - Android 实时傅立叶变换 - Renderscript

java - Firestore SetOptions.mergeFields 不存储字段

java - 将 logger.debug ("message: "+ 文本)转换为 logger.debug(消息 : {}", 文本)

php - 当数据库关闭时捕获 'PDOException'

oop - 这种设计模式的名称?

c# - 是否有可能在代码中丢失过度继承?

java - 如何循环 JSON 并将其转换为 Java 对象

java - 如何在java中记录HTTP错误