我正在完成一个项目,它有100-150个课程和......吹...很多方法。对于开发,我从一开始就使用了“尽可能使用修饰符'最终'”保存动作。但是这可以让我的方法(以及我手动创建的类而不是助手)没有他们应得的final / abstract关键字。实际上,我不想通过每个类和方法声明来手动完成它们。我确信有一种方法可以告诉eclipse“以最严格的方式为我做这件事(即如果一个类从未实例化,将其设置为抽象,否则,如果从未扩展,则将其设置为final,否则什么都没有和类似的东西 - 没有抽象的部分,显然 - 对于方法而言。)
我是对的吗?如果是这样,那是哪种方式?
答案 0 :(得分:3)
强制执行启发式搜索可能会有问题。这可能是eclipse没有实现它们的原因。
将代码中未扩展的所有类设置为final
- IDE如何知道它们是否打算在其他地方扩展?只有在你真的打算禁止扩展时才使它们成为final
。
同样适用于abstract
- IDE无法知道您是在编写框架,还是只编写域模型.jar
,其中永远不会进行任何初始化。自动制作实体abstract
可能会在以后射击你。
变量的情况很少,所以这种启发式日食可以做到。
编辑我想我必须详细说明我的理由。
添加final
修饰符对于变量没有问题,因为它们主要是本地化的 - 它们存在于您控制下的代码范围内。很少有可变形的变量对第三方代码可见,并且可以在不调用方法的情况下进行修改。
如果变量上的final
修饰符过多,则其影响将仅限于您的代码,您可能会很快注意到它。所以最糟糕的情况是你必须打开文件并删除修饰符。
课程的情况有所不同 - 其中许多是公开的,因此可以访问第三方代码。如果您将代码中未实例化的所有类声明为abstract
,那么您将有效地禁止其他人实例化它 - 这次您甚至都不会知道。因此,最糟糕的情况是其他人将无法使用您的代码。这就是为什么我不会自动化它 - 大多数时候你希望第三方代码能够实例化你定义的类。
然而,当一个类只有静态方法时,有关于何时创建类final
的启发式方法。像PMD和Checkstyle这样的工具知道这一点,并会告诉你它。这个选项实际上很适合eclipse,但遗憾的是没有实现。
至于违约行为final
- andersoj和许多其他人遵守“继承设计或禁止它”的原则 - 我认为它是由Joshua Bloch在他的“Effective Java”一书中介绍的。其他人认为,违反开放封闭原则,默认“封锁”所有类别。我倾向于后者。
答案 1 :(得分:2)
在最终课程的情况下,你只需要标记最后的课程,你不需要标记每个方法......也许这有点帮助。与kostja的答案相反,我会说默认情况下将您的课程标记为最终,如果您明确设计了扩展,则只留下最终版本。无论如何,这应该是特殊情况(“prefer composition to extension”),除非你正在做一些专门的事情。