繁体   English   中英

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

[英]Java: Unregister listeners in Closeable.close()

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

我认为Closeable主要是为了关闭OS资源(例如文件......)而且我不确定监听器案例是否超出了Closeable的责任范围。

这里有一定程度的意见,但基于文档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就是这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM