gpt4 book ai didi

Java 设计 : dealing with data objects used by many classes

转载 作者:搜寻专家 更新时间:2023-11-01 02:51:17 24 4
gpt4 key购买 nike

首先,简要描述一下提出这个问题的库:

我有一个库,它在提供的串行端口上连续监听,读取字节 block 并将它们传递给以某种有意义的方式进行处理(细节对问题并不重要)。为了使该库更具可重用性,处理这些字节被抽象为一个接口(interface) (FrameProcessor)。库本身中存在一些默认实现来处理无论应用程序使用它总是会发生的处理。但是,支持添加自定义处理器来执行应用程序特别关心的事情。

除了传递给这些处理器的字节之外,还有一个数据对象 (ReceiverData),其中包含大多数(但不保证是所有)处理器可能会感兴趣的信息。它完全由库本身维护(即,设置/维护 ReceiverData 的任何实例不是应用程序的责任。他们不必关心数据是如何可用的,只关心它是否可用)。

现在,ReceiverData 作为参数传递给每个处理器:

public interface FrameProcessor {

public boolean process(byte[] frame, ReceiverData receiverData);
}

但是,我真的不喜欢这种方法,因为它需要将数据传递给可能不一定关心它的对象。此外,对于确实关心 ReceiverData 的处理器,它们必须在它们进行的任何其他方法调用中传递对象引用(前提是这些方法调用需要访问该数据)。

我考虑过将 FrameProcessor 更改为抽象类,然后为 protected ReceiverData 成员定义一个 setter。但这似乎也有点恶心 - 必须遍历所有 FrameProcessor 的列表并设置 ReceiverData 实例。

我还考虑过某种静态线程上下文对象(必须是线程化的,因为该库支持同时监听多个端口)。本质上,您将拥有类似以下内容的内容:

public class ThreadedContext {

private static Map<Long, ReceiverData> receiverData;

static {
receiverData = new HashMap<Long, ReceiverData>();
}

public static ReceiverData get() {
return receiverData.get(Thread.currentThread().getId());
}

public static void put(ReceiverData data) {
receiverData.put(Thread.currentThread().getId(), data);
}
}

这样,当库中的每个线程启动时,它只需将对其 ReceiverData 的引用添加到 ThreadedContext,然后处理器就可以根据需要使用它,而无需传递它。

这当然是一个迂腐的问题,因为我已经有了一个运行良好的解决方案。这让我很困扰。想法?更好的方法?

最佳答案

我最喜欢你目前的方法。它本质上是线程安全的(因为无状态)。它允许多个线程使用同一个处理器。它易于理解和使用。例如,它非常类似于 servlet 的工作方式:请求和响应对象被传递给 servlet,即使它们并不关心它们。而且单元测试也非常容易,因为您不必设置线程本地上下文即可测试处理器。您只需传递一个 ReceiverData(真实的或假的),仅此而已。

您可以将两者混合在一个参数中,而不是传递字节数组和 ReceiverData。

关于Java 设计 : dealing with data objects used by many classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677123/

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