Bol*_*pat 2 java static try-with-resources sonarqube autocloseable
I\xe2\x80\x99m 是 Java 库的作者,该库提供对我们公司销售的 C++ 库的 Java 访问。类 \xe2\x80\x9cown\xe2\x80\x9d C++ 对象之一的实例,具有以下意义:该类具有一些long
由某些方法设置的私有字段native
,并且具有指向C++ 堆。由于 C++ 堆不会被垃圾回收,因此当拥有的 Java 对象不再需要它们时,特别是当拥有的 Java 对象本身不再需要时,必须手动释放内存,因此该类实现AutoClosable
并close()
释放实例拥有的所有 C++ 内存。理想情况下,用户将try
在该类的实例上使用 -with-resources。
一位客户抱怨 SonarQube 警告他们, \xe2\x80\x99t 不会调用释放资源,并建议在对象上close()
使用-with-resources,但该对象由变量或等效对象保存,并且一直存在,直到应用程序关闭(如据我了解)。我想帮助他们,但删除(按照他们的建议)根本就是\xe2\x80\x99不正确。问题与内存有关:当应用程序结束并且 C++ 库被卸载时,内存资源无论如何都会被释放(由操作系统)。try
static
AutoClosable
那么,理想情况下,如何AutoClosable
以 SonarQube 检测到的方式关闭静态变量所持有的对象呢?Java 似乎没有可以使用的与类初始值设定项相反的类型。
我不\xe2\x80\x99t 有权访问SonarQube 来玩玩并看看什么可以工作,即当SonarQube 识别出close()
将被调用时。我\xe2\x80\x99m 想要告诉他们应该适当地重新配置SonarQube 或抑制警告。问这个问题,我想确保它\xe2\x80\x99本质上是最好的行动方案。\xe2\x80\x9c是的,如果这是真的,\xe2\x80\x9d 将是一个合适的答案。当然,不使用全局状态,即没有 astatic
AutoClosable
是理所当然的,但我想他们已经知道了。
似乎没有人遇到过static
AutoClosable
对象的问题,因为 Stack Overflow 上没有关于它的问题。\n我认为这与.NET (C#) 中AutoClosable
的类似,并且我发现这个问题非常询问这个问题,但是答案特定于用例和 .NET,并且 don\xe2\x80\x99t 提供通用解决方案。IDisposable
\n\n一位客户抱怨 SonarQube 警告他们 close() 不会被调用以释放资源,并建议在对象上使用 try-with-resources,但该对象由静态变量或等效变量保存,直到应用程序关闭(据我所知)。
\n
“医生,我用锤子砸我的脸,好痛啊!”
\n那就别再这样做了。
\nSonarQube 是一个工具。它可以被配置为只说一些愚蠢的事情,类似于那个锤子。解决办法不是尝试长出一张防锤的脸。解决办法就是停止做那些唯一目的是伤害的事情。
\n不幸的是,您的客户可能不愿意听到这个消息。
\n但如果是的话,他们可以告诉 sonarqube 停止这样做。他们甚至可以添加一个简单的评论来告诉 sonarqube 不要抱怨该特定案例。
\n\n\n似乎没有人遇到过静态 AutoClosable 对象的问题,因为 Stack Overflow 上没有关于它的问题。
\n
即使是您的客户想要它也是一件奇怪的事情。如果有一个具有这种状态的全局变量,这意味着您的客户的代码是不可测试的(例如,他们无法真正用虚拟实现替换它) - 但是,同样,考虑到它是客户,他们可能不愿意听到。
\n通常,您会在应用程序启动后立即创建资源,并将其交给 try-with 块中的其余代码,除非应用程序退出,否则该块永远不会退出:
\npublic static void main(String[] args) {\n try (var out = new FileOutputStream(args[0])) {\n yourActualApp(out);\n }\n
Run Code Online (Sandbox Code Playgroud)\n像上面这样的东西。这同样适用于您的图书馆。但是,您的客户必须希望摆脱静态的全球领域,并将资源传递到各处才能使这项工作发挥作用,但他们可能不想这样做。
\n将代表您的资源的任何 Java 类拆分为 twain。2 个类,这两个类都简单地包装了实际的实现。一个实现了 AutoClosable,另一个则没有。将不属于“GlobalFoo”的名称命名为 Foo,其中 Foo 是您当前对它的命名 - 并将其放入其 javadoc 中,表明此类事物的目的是它在 JVM 的生命周期中存在。这样,您的用户必须明确选择“nono,这个永远存在,无需关闭它!”,并且您可以添加一些智能,例如 - 如果它是具有唯一密钥的资源(例如,它代表一个文件)。文件具有唯一键:完全限定的文件名!) - 您可以存储这些唯一键,并在库的用户尝试多次使用相同键创建此类全局对象时抛出错误。
\n您可以让一个扩展另一个 - 该扩展器仅添加 AutoClosable,仅此而已。
\n 归档时间: |
|
查看次数: |
98 次 |
最近记录: |