Java:在Closeable.close()中取消注册侦听器

时间:2017-02-27 09:01:10

标签: java

我有时必须编写将自己注册为其他对象的侦听器的对象。 良好的编程实践表明我们应该始终取消注册这样的监听器。 通过使类实现Closeable并取消注册close()内的侦听器来尝试强制执行此类行为是一种好习惯吗?

我认为Closeable主要用于关闭操作系统资源(例如文件......),我不确定监听器案例是否超出了Closeable的责任范围。

1 个答案:

答案 0 :(得分:1)

这里有一定程度的意见,但根据documentation和方法close的名称,我会为它创建一个不同的方法(并称之为unregister) 。原因是您希望代码尽可能不言自明。

另请注意close()本身的文档:

  

关闭此流并释放与其关联的所有系统资源。如果流已经关闭,则调用此方法无效。

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

修改

顺便说一句,看起来如果您想使用Closeable解决方案,更好的方法是实现AutoCloseable,因为它允许您在代码中使用try-with-resources使用这些听众。在AutoCloseable的文档中,提到了以下内容:

  

API注意:

     

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

本说明暗示,即使其实现不使用实际资源,类也可能实现AutoCloseable。但是,该注释还表明应该至少有一个子类(在您的情况下,至少有一种类型的侦听器)确实使用实际资源。 Stream API就属于这种情况。