除了将类声明为final或者将其构造函数声明为private之外,还有其他方法可以阻止类的继承吗?
答案 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 Principle和here。保护你的功能,但不要让那个进来并支持它的人不可能......
答案 7 :(得分:0)
不使用最终类,基本上可以使所有构造函数都是私有的:
public class A {
private A() {} //Overriding default constructor of Java
}
虽然也会通过禁止创建此类的对象来使这个类抽象化,但是由于任何继承在构造函数中需要super();
,并且因为构造函数是私有的,编译错误将是最大的你可以在尝试继承该类时获得。
然而,我建议使用final,因为它代码较少,并且包括创建对象的选项。