Java 为什么PMD建议将JSONArray声明为最终版本

Java 为什么PMD建议将JSONArray声明为最终版本,java,pmd,Java,Pmd,我在我的源代码上运行了PMD,这有点像这样 JSONArray jsarray_com = new JSONArray(); jsarray_com.put("One"); jsarray_com.put("Two"); final JSONArray jsarray_com = new JSONArray(); 稍后,我将以这种方式向jsarray_com添加一些元素 JSONArray jsarray_com = new JSONArray(); jsarray_com.put("O

我在我的源代码上运行了PMD,这有点像这样

JSONArray jsarray_com = new JSONArray();
jsarray_com.put("One");
jsarray_com.put("Two");
final JSONArray jsarray_com = new JSONArray();
稍后,我将以这种方式向jsarray_com添加一些元素

JSONArray jsarray_com = new JSONArray();
jsarray_com.put("One");
jsarray_com.put("Two");
final JSONArray jsarray_com = new JSONArray();
现在来讨论PMD建议的问题是将JSONArray声明为final

你能告诉我,如果它被宣布为决赛,你会得到什么好处吗

当我这样做的时候

JSONArray jsarray_com = new JSONArray();
jsarray_com.put("One");
jsarray_com.put("Two");
final JSONArray jsarray_com = new JSONArray();
代码运行良好。

我猜您的意思是PMD中的规则:这只是一个优化问题:因为PMD注意到您的变量只分配了一次,它建议您可以将其声明为final,因为它将生成最佳代码

然而,我同意他的评论:这可能是一种古老的优化技术,但在现代JIT编译器中,它没有什么区别。我通常会关闭这个规则(或者至少忽略它)。声明最终成员和最终类是一种很好的做法,但声明最终局部变量或参数。。。psch

我猜您是指PMD中的规则:这只是一个优化问题:因为PMD注意到您的变量只分配了一次,它建议您可以将其声明为final,因为它将生成最佳代码


然而,我同意他的评论:这可能是一种古老的优化技术,但在现代JIT编译器中,它没有什么区别。我通常会关闭这个规则(或者至少忽略它)。声明最终成员和最终类是一种很好的做法,但声明最终局部变量或参数。。。psch

PMD检测到
jsarray\u com
从未重新分配,因此建议在声明中添加
final
,以明确这一事实。当您看到
final
时,您立即知道
jsarray\u com
将始终引用相同的对象。它使代码更容易理解,但您可以随意忽略该建议

在可能的情况下使用
final
,也可能有助于JVM优化您的代码,尽管最后一点与此无关。事实上,大多数JVM都能够在没有用户任何输入的情况下解决这个问题,就像PMD一样

请注意,将变量声明为
final
不会阻止您通过
.put()
等方法修改对象。例如,你可以这样做:

jsarray_com.put("foo");
但不是这个:

jsarray_com = anotherarray_com;

PMD检测到
jsarray\u com
从未重新分配,因此建议在声明中添加
final
,以明确这一事实。当您看到
final
时,您立即知道
jsarray\u com
将始终引用相同的对象。它使代码更容易理解,但您可以随意忽略该建议

在可能的情况下使用
final
,也可能有助于JVM优化您的代码,尽管最后一点与此无关。事实上,大多数JVM都能够在没有用户任何输入的情况下解决这个问题,就像PMD一样

请注意,将变量声明为
final
不会阻止您通过
.put()
等方法修改对象。例如,你可以这样做:

jsarray_com.put("foo");
但不是这个:

jsarray_com = anotherarray_com;

你能分享一个更完整的片段,以及你从PMD得到的建议文本吗?我建议你关闭这个诊断。你能分享一个更完整的片段吗,以及从PMD得到的建议文本?我建议只关闭此诊断。这实际上是错误的:JIT编译器足够聪明,可以自行查看变量是否只分配了一次。这可能是Java1.4的合理优化,但不是现在。好的,谢谢你提供的信息。我只是引用了PMD正在做的事情,但我编辑了我的评论来添加你的观点。这实际上是错误的:JIT编译器足够聪明,可以自行查看变量是否只分配了一次。这可能是Java1.4的合理优化,但不是现在。好的,谢谢你提供的信息。我只是引用了PMD正在做的事情,但我编辑了我的评论来补充你的观点。