2

我正在完成一个项目,它有 100-150 个类和...puff..很多很多方法。对于开发,我从一开始就使用了“在可能的情况下使用修饰符'final'”保存操作。但这让我的方法(以及我手动而不是使用助手创建的类)没有他们应得的 final/abstract 关键字。真的,我不想通过每个类和方法声明来手动完成它们。我确信有一种方法可以告诉 eclipse 以最严格的方式为我做这件事(即,如果一个类从未被实例化,则将其设置为抽象类,否则,如果从未扩展,则将其设置为 final,否则什么也没有,以及类似的东西 - 显然没有抽象部分 - 用于方法)。

我对吗?如果是这样,那是哪种方式?

4

2 回答 2

3

强制执行您的启发式方法可能会有问题。这可能是eclipse没有实现它们的原因。

将所有未在代码中扩展的类设置为final- IDE 如何知道它们是否打算在其他地方扩展?final仅当您确实打算禁止扩展时才制作它们。

这同样适用abstract- IDE 无法知道您是在编写一个框架,还是只是一个域模型.jar,其中永远不会有任何初始化。自动制作实体abstract可能会在以后击中你的脚。

变量很少出现这种情况,因此这种启发式 Eclipse 可以做到。

编辑我想我必须详细说明我的推理。

添加final修饰符对变量没有问题,因为它们大多是本地化的——它们存在于您控制的代码范围内。很少有可修改的变量对 3rd 方代码可见,并且可以在不调用方法的情况下进行修改。

如果final变量上的修饰符过多,它的影响将仅限于您的代码,您可能会很快注意到它。所以最坏的情况是你必须打开文件并删除修改器。

类的情况有所不同——其中许多是公共的,因此可以被 3rd 方代码访问。如果您将所有未在代码中实例化的类声明为abstract,您将有效地禁止其他人实例化它——这一次您甚至都不知道。所以这里最糟糕的情况是其他人将无法使用您的代码。这就是我不会自动化它的原因——大多数时候,您希望 3rd 方代码能够实例化您定义的类。

final然而,当一个类只有静态方法时,有一个关于何时创建类的启发式方法。一些工具,如 PMD 和 Checkstyle 知道这一点,并会告诉你。这个选项实际上很适合 eclipse,但不幸的是没有实现。

至于final默认设置类对象——andersoj 和许多其他人坚持“为继承而设计或禁止它”的原则——我认为它是由 Joshua Bloch 在他的“Effective Java”一书中介绍的。其他人则认为,默认情况下“密封”所有类将违反开放封闭原则。我倾向于后者。

于 2013-03-15T12:12:03.733 回答
2

在 final 类的情况下,你只需要标记类 final,你不需要标记每个方法......也许这有点帮助。与 kostja 的回答相反,我会说默认情况下将您的类标记为 final,并且只有在您明确设计用于扩展时才离开 final。无论如何,这应该是例外情况(“更喜欢组合而不是扩展”),除非您正在做一些专门的事情。

于 2013-03-15T12:21:27.243 回答