2017-02-27 72 views
3

我有时必须编写将自己注册为侦听器的对象到其他对象上。良好的编程实践表示,我们应该始终注销这样的听众。 试图通过让类实现Closeable并取消注册close()中的侦听器来强制执行此类行为是否是一种很好的做法?Java:在Closeable.close()中取消注册侦听器

我以为Closeable主要是为了关闭操作系统资源(例如文件..),我不确定侦听程序的情况是否超出了Closeable的责任范围。

+0

这意味着听众会知道如何取消自己的注册,并跟踪注册的任何地方。 –

回答

1

这里有一些意见,但基于documentationclose方法的名称,我会为它创建一个不同的方法(并将其称为unregister)。原因是你希望代码尽可能地不言自明。

还应注意close()本身的文档:

关闭此流并释放与之关联的所有系统资源。如果流已经关闭,则调用此方法不起作用。

根据您描述的代码,没有这样的流或系统资源。

编辑:

顺便说一句,似乎如果你想要去的Closeable解决方案,更好的办法是实施AutoCloseable,而不是因为它让你在代码中使用try-与资源使用这些听众。在AutoCloseable的文档,以下提到:

API注:

这是可能的,而且实际上很常见的,一个基类来实现AutoCloseable即使不是所有的子类或者实例将拥有可释放的资源。对于必须完全通用的代码或知道AutoCloseable实例需要资源释放的代码,建议使用try-with-resources结构。但是,如果使用支持基于I/O和非基于I/O的表单的Stream等工具,则在使用非基于I/O的表单时通常不需要尝试使用资源块。

这注意味着一类可以实现AutoCloseable即使其实现不使用实际资源。但是,注意还表明,至少应该有一个子类(在你的情况下,至少有一种类型的侦听器)使用实际资源。 Stream API就是这种情况。

+0

我同意,但为什么我们需要创建另一个界面?一般的Java开发人员知道'Closeable',并知道如何处理可关闭的对象。 创建另一个接口或'unregister()'方法只会增加API的复杂性。 –

+0

@MarcoRomano我扩大了答案。如果没有一个监听器子类使用资源,我仍然会为它们创建一个单独的接口。我仍然赞成可重复性,以避免重复使用已存在的内容,但这并不完全适用于我的案例。 – manouti

相关问题