不使用final就停止继承

时间:2009-01-16 17:00:44

标签: java inheritance

除了将类声明为final或者将其构造函数声明为private之外,还有其他方法可以阻止类的继承吗?

8 个答案:

答案 0 :(得分:28)

评论

//Do not inherit please

答案 1 :(得分:23)

还有两个选择:

  • 使每个方法都是最终的,因此人们无法覆盖它们。您可以避免以这种方式从子类中意外调用方法。但这并不会阻止子类化。

  • 将check检查到类的构造函数:

    if (this.getClass() != MyClass.class) {
        throw new RuntimeException("Subclasses not allowed");
    }
    

    然后没人能够实例化你班级的子类。

(不是我建议使用这些技术,它只是出现在我的脑海里。我会使用最终类和/或私有构造函数)

答案 2 :(得分:8)

最终创建是为了解决这个问题。

答案 3 :(得分:7)

  • 使用最终
  • 使用私有构造函数
  • 使用评论:

    // do not inherit
    
  • 使用javadoc评论

  • 让每个方法都最终,所以人们不能覆盖它们
  • 在类构造函数中使用运行时检查:

    if (this.getClass() != MyClass.class) {
        throw new RuntimeException("Subclasses not allowed");
    }
    

答案 4 :(得分:4)

使用final是规范的方式。

public final class FinalClass {
  // Class definition
}

如果要阻止覆盖单个方法,可以将它们声明为final。 (我只是在这里猜测,为什么你会希望避免让全班决定。)

答案 5 :(得分:3)

使构造函数为私有,并提供工厂函数来创建实例。

当您想从多个选择适当的实现时,这可能特别有用,但不希望允许任意子类化,如

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 { ... }
}

答案 6 :(得分:1)

我不得不说这通常是糟糕的形式。虽然几乎总有一些事情是有效的,但我不得不说在OO世界中停止继承通常不是一个好主意。阅读Open-Closed Principlehere。保护你的功能,但不要让那个进来并支持它的人不可能......

答案 7 :(得分:0)

不使用最终类,基本上可以使所有构造函数都是私有的:

public class A {
    private A() {} //Overriding default constructor of Java
}

虽然也会通过禁止创建此类的对象来使这个类抽象化,但是由于任何继承在构造函数中需要super();,并且因为构造函数是私有的,编译错误将是最大的你可以在尝试继承该类时获得。 然而,我建议使用final,因为它代码较少,并且包括创建对象的选项。