当对象不使用其类方法时,如何标记编译器警告?

时间:2013-07-07 05:09:47

标签: java annotations

我有一个名为SQLProvider的类,它包含用于打开和关闭SQLite数据库连接的方法。使用注释或其他方法,如果使用open方法而不调用close,是否可以标记编译器警告?

{
    SQLProvider provider = new SQLProvider();
    provider.open()
    // display a compiler warning unless provider.close() is also invoked in this code block
}

2 个答案:

答案 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的回答),一些静态代码分析器可以警告你:

但问题是这些警告或多或少是启发式的。他们只了解某些标准惯用语以便可靠地关闭资源。如果你以其他方式(仍然证明可靠)这样做,他们可能会产生错误的警告。这不一定是坏的(因为这样做非标准的方式可能会愚弄/困扰未来的读者!)。然而,误报的可能性可能诱使开发人员忽视或(更糟糕的是)抑制警告。

还有一些其他问题:

  • 这些检查可能对使用close()方法而未实施CloseableAutoCloseable的资源对象给予误报。

  • 这些检查可能Closeable / AutoCloseable资源对象给出假阴性,其中close()操作是无操作的;例如,StringWriter

这些问题可能解释了标准Java工具链不支持此问题的原因。