当然,通过将课程作为决赛,我们无法扩展它。除了这些之外,还有其他方法可以创建一个不可扩展的类吗?
答案 0 :(得分:2)
在类private
中创建所有构造函数(或者如果您只关心另一个包中的子类,则赋予它们默认访问权限),包括private
无参数构造函数。尝试从这样的类继承的任何类都不会编译,即使没有尝试创建子类的对象。您仍然可以使用静态getInstance(arguments)
类型方法来实例化此类。
但是,防止类被扩展的最明确和最干净的方法是将类声明为final
。
答案 1 :(得分:1)
以下是方法,我们可以防止类被子类化。
声明类final
,没有其他类可以对它进行子类化。 这是阻止类扩展的最佳方法。 final
关键字用于此目的。
不要暴露任何非私有的构造函数。如果没有定义构造函数,则定义default constructor
并声明它private
。请注意,在这种情况下,内部类仍然可以扩展外部封闭类。因此,我们更好地将该类声明为最终类。我们有类String.java
,Integer.java
等类,这些类不能被子类化,并且这些类被声明为final
。
从所有构造函数中抛出运行时异常。这将禁止创建对象。你可以有一个私有构造函数,没有代码抛出异常,创建对象(可能在公共静态方法中)。这不会给出编译时间,但会在尝试创建子类对象时在运行时抛出异常。子类可以从静态方法调用构造函数并将其包装在try catch块中。 Hench这不像上面两个那么干净。
不变性不仅仅是声明一个类final
或将构造函数限制为私有范围。您还需要保护任何可变状态。以上回答仅旨在解决具有不能分类的类的问题。