2010-05-21 39 views
4

我有一个BlockingQueue实现正在生产者 - 消费者的情况下使用。我想装饰这个队列,以便记录从它获取的每个对象。我知道简单的实现是什么样的:只需实现BlockingQueue并接受所有方法将委派给其的构造函数中的BlockingQueue。有没有另一种方法,我错过了?一个图书馆可能?有回调界面的东西?BlockingQueue修饰器,记录已删除的对象

回答

1

您可能希望考虑的另一种选择是dynamic proxies。这使您可以使用反射式API来处理在给定接口上发出的请求 - 将所有调用委托给基础实现非常简单,同时添加一些日志记录逻辑(如果方法名称与匹配方法之一匹配)。

这种方法的缺点是它增加了所有方法调用的额外开销(几乎可以忽略一般使用,尽管如果在关键性能部分使用这个应该是黄色标志),并且代码可以最终看起来很麻烦。最终,您所做的是定义与您在帖子中描述的行为完全相同的行为,除非您不需要明确编写每个委托方法,而是提供一种通配实现。

+0

好主意!它会偶尔用于记录'BlockingQueue',所以性能并不是什么大问题。本文有一个使用动态代理进行日志记录的示例:http://www.ibm.com/developerworks/java/library/j-jtp08305.html – 2010-05-21 14:52:16

2

我原以为创建一个扩展BlockingQueue接口的相关实现类并覆盖remove方法的类将会更简单,并且会根据需要替换其他方法。

编辑

创建的包装是一个更好的实施,如果OP是使用一个以上的实施BlockingQueue,但它引入了一个小的性能击中所有操作,和其他小问题。

我的观点是,扩展队列类是替代封装它。这是否是一个更好的选择取决于具体情况。

+0

我们是否都在谈论相同的界面? Java'BlockingQueue'接口中没有'accept'方法。 – 2010-05-21 09:42:25

+1

BlockingQueue是一个接口 - 鉴于此,我认为OP提出的组合方法比继承更好,因为它意味着它们可以在不同的BlockingQueue实现中交换。 – Adamski 2010-05-21 10:51:49