在不使用final的情况下停止inheritance
除了将其声明为final或者将其构造函数声明为private之外,还有其他方法可以阻止类的inheritance吗?
一条评论
//Do not inherit please
还有两个选择:
-
使每个方法都是最终的,所以人们不能覆盖它们。 您可以避免以这种方式从子类中意外调用方法。 但这并不会阻止子类化。
-
把检查放到类的构造函数中:
if (this.getClass() != MyClass.class) { throw new RuntimeException("Subclasses not allowed"); }
然后没人能够实例化你的类的子类。
(不是我建议使用这些技术,它只是出现在我的脑海里。我将使用final类和/或私有构造函数)
最终创建是为了解决这个问题。
- 使用final
- 使用私有构造函数
-
使用评论:
// do not inherit
-
使用javadoc注释
- 让每个方法都最终,所以人们不能覆盖它们
-
在类构造函数中使用运行时检查:
if (this.getClass() != MyClass.class) { throw new RuntimeException("Subclasses not allowed"); }
使用final
是规范的方式。
public final class FinalClass { // Class definition }
如果要防止覆盖单个方法,可以将它们声明为final。 (我只是在这里猜测,为什么你要避免让全class决赛。)
使构造函数成为私有的,并提供工厂函数来创建实例。
当您想从多个选择适当的实现时,这可能特别有用,但不希望允许任意子类化
abstract class Matrix { public static Matrix fromDoubleArray(double[][] elemens) { if (isSparse(elements)) { return new SparseMatrix(elements); } else { return new DenseMatrix(elements); } } private Matrix() { ... } // Even though it's private, inner sub-classes can still use it private static class SparseMatrix extends Matrix { ... } }
我不得不说这通常是糟糕的forms。 虽然几乎总有一些事情是有效的,但我不得不说在OO世界中停止inheritance通常不是一个好主意。 阅读开放封闭原则和此处 。 保护您的function,但不要让进入并支持它的人不可能……
在不使用final类的情况下,您基本上可以将所有构造函数设为私有:
public class A { private A() {} //Overriding default constructor of Java }
虽然通过禁止创建这个类的对象也会使这个类抽象化,但是任何inheritance都需要super();
在构造函数中,并且因为构造函数是私有的,编译错误将是您尝试inheritance该类时可以获得的最大值。 然而,我建议使用final而不是代码,包括创建对象的选项。