我有一个名为SQLProvider的类,它包含用于打开和关闭SQLite数据库连接的方法。使用注释或其他方法,如果使用open方法而不调用close,是否可以标记编译器警告?
{
SQLProvider provider = new SQLProvider();
provider.open()
// display a compiler warning unless provider.close() is also invoked in this code block
}
答案 0 :(得分:5)
我不确定这是最好的方法,但你可以让你的类实现Closeable接口。根据Eclipse documenatation,Eclipse将显示警告:
启用后,如果局部变量包含“java.lang.AutoCloseable”类型的值(compliance> = 1.7)或类型为“java.io.Closeable”的值,编译器将发出错误或警告(compliance< = 1.6)如果流分析显示方法'close()'没有在该值上本地调用。
答案 1 :(得分:0)
目前标准Java工具链中没有这样的工具。
除了Eclipse编译器警告(参见New Idiot的回答),一些静态代码分析器可以警告你:
CloseResource
设计规则涵盖了这个(或至少一些子句......)但问题是这些警告或多或少是启发式的。他们只了解某些标准惯用语以便可靠地关闭资源。如果你以其他方式(仍然证明可靠)这样做,他们可能会产生错误的警告。这不一定是坏的(因为这样做非标准的方式可能会愚弄/困扰未来的读者!)。然而,误报的可能性可能诱使开发人员忽视或(更糟糕的是)抑制警告。
还有一些其他问题:
这些检查可能对使用close()
方法而未实施Closeable
或AutoCloseable
的资源对象给予误报。
这些检查可能对Closeable
/ AutoCloseable
资源对象给出假阴性,其中close()
操作是无操作的;例如,StringWriter
。
这些问题可能解释了标准Java工具链不支持此问题的原因。