![](/img/trans.png)
[英]java.io.Closeable: why throwing RuntimeException in close() works?
[英]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.