在不使用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而不是代码,包括创建对象的选项。