gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:51 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com