批量重构以使Java方法参数为final

4
我正在寻找一种批量重构完整Java应用程序的方法,具体来说是将未声明为final的方法参数设置为final。
这里是否有人知道这样的工具?或者可以解析Java源代码并可以进行此类更改的工具。

兴趣之余,想要这样做的想法是什么? - NPE
@aix 这似乎并不是必要的,说实话也确实不是。但我也采用了这种风格。它可以防止你意外重新分配方法参数。大多数情况下这不会成为问题,但将参数设置为 final 只需要付出一点点努力。此外,当一个参数没有被设置为 final,而其他所有参数都是 final 时,立即就能清楚地看出你打算重新分配这个参数(例如,用其修剪版本替换字符串)。 - G_H
我对这个想法很同情,但我的方法通常都很简单,所以它只是多余的干扰。我尝试了一段时间,但最终放弃了——Java已经足够难读懂了。 - Dave Newton
避免重新分配方法参数,这真的是一个避免难以追踪后续错误的问题。 - Jan Goyvaerts
3个回答

8
你可以在IntelliJ中进行批量更改,将每个可以是final的字段、局部变量或参数修改为final。使用该选项进行代码分析,并全局"应用修复",确保它仍然能够编译,因为在某些情况下它可能没有完全正确地实现。

真棒!也许我应该给IntelliJ一个机会。到目前为止我还没有使用它,因为它在检出SVN的时候有问题。 - G_H

4

正如Peter Lawrey所建议的那样,IntelliJ可以实现此功能。

分析 -> 检查代码 -> 自定义配置文件

在“代码风格问题”部分中,您可以看到:

字段可能是final

This inspection reports any fields which may safely be made final. A static field may 
be final if it is initialized in its declaration or in one static class initializer, but 
not both. A non-static field may be final if it is initialized in its declaration or in 
one non-static class initializer or in all constructors.
Powered by InspectionGadgets

局部变量或参数可以是final

This inspection reports parameters or local variables, found in the specified inspection
scope, that may have a final modifier added.

Use check boxes in the inspection options below, to define whether parameters or local
variables (or both) are to be reported.

这将很可能只是使可以安全地成为最终变量的变量成为最终的,但你试图找到的那些变量仍然不会是最终的。尽管如此,这是一种发现它们的方法。


0

我不知道Eclipse或NetBeans中是否有这样的重构工具。但是一个不错的正则表达式替换可以解决问题。为了确保您不会在不应该发生的地方意外执行它,您可能需要手动确认每个替换。如果您有数百个类,则这可能并不可行。在这种情况下,到处进行替换,然后检查与旧版本的差异可能会有所帮助。

如果任何参数因被覆盖而没有被声明为final,那么在编译期间就会变得清晰明了。


Netbeans 7.1beta启动了一个类似的功能,称为“检查和转换”。例如,已经可以删除未使用的导入语句。我想这只是时间问题,也会有这个检查。 - Jan Goyvaerts
@JanGoyvaerts 很有意思!更强大的重构总是很好的。关于未使用的导入,快速按下Ctrl+Shift+I应该可以解决导入问题,包括移除未使用的导入。我至少在7.0.1版本中知道它会这样做。 - G_H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接