Java Design:处理许多类使用的数据对象

首先,简要介绍了提出这个问题的图书馆:

我有一个库,它在一个提供的串口上连续监听,读取字节块并传递它们以一些有意义的方式处理(细节对问题并不重要).为了使库更可重用,处理这些字节被抽象出一个接口(FrameProcessor).库本身中存在一些默认实现来处理始终会发生的处理,而不管使用它的应用程序如何.但是,支持添加自定义处理器来执行应用程序特别关注的操作.

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

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

public interface FrameProcessor {

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

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

我已经考虑将FrameProcessor更改为抽象类,然后为受保护的ReceiverData成员定义一个setter.但这看起来有点粗糙 – 必须迭代所有FrameProcessors的列表并设置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 Design:处理许多类使用的数据对象 - 代码日志