我喜欢我的代码写得很好;然而,我遇到的不是真正的问题,而是更多关于约定的问题。说我有这门课。
public class Test {
public void doStuff() {
System.out.println("stuff");
}
}这个类不会被扩展,所以它应该是最终的吗?我知道,当您不希望扩展一个类时,您会将它变成最终的;但是,在这种情况下,类将不会被扩展。抱歉,如果这让人困惑的话。我基本上在想,你是否应该让每一堂不会被延长到最后阶段的课。
发布于 2015-05-17 23:47:12
对于校验方式,我有一个爱/恨的关系的规则之一是在班级设计部分- 可拓设计。我经常发现自己关掉了它,因为跟从'T‘是很烦人的--特别是在大型遗留项目中,如果没有遵循它(检查样式发出了大量警告,就很难修复其中的任何一个)。
尽管如此,这是一个相当简单的规则:
确切的规则是,可以子类的非私有、非静态类方法必须是
如果您可以对一个类进行子类化,则应该使它能够以一种有意义的方式进行扩展。
“等等,”你说,“这是关于公共非静态方法的,这些方法要么是抽象的,要么是最终的,或者是空的。这与最终的类有什么关系?”
确切的规则是,可以子类的非私有、非静态类方法必须.
如果你离开一个非决赛类,你是在说它可以有意义地被子类化。如果它不能,那么它就不能被子类化。
通过使类最终完成,您的同事通过创建一个公开所有特定于实现的方法的子类来对其内部进行修改就有点困难了。没有什么比追踪一个bug更好的事情了,因为你写的一个不可变的东西被子类化了--相信我。
为继承而设计是昂贵的。这需要额外的思考,以确保你是正确的。其他人不会把事情搞砸。通过说final class,你避免了所有这些,说“不-这不能继承”,并使它更容易解释。
如果您没有将时间花在设计类的可扩展性上,那么应该做的是确保没有人因为认为类是可扩展的而犯了错误。
相关阅读:
发布于 2015-05-17 23:48:40
Eric有一个关于为什么要标记最终类的优秀博客帖子。具体来说,他提到了微软声明.NET框架类sealed的实践,但原则是相同的。
总之,编写可扩展类与编写final类完全不同。
另请参阅
https://softwareengineering.stackexchange.com/questions/284156
复制相似问题