将类作为最终类和将类构造函数作为私有类有什么区别实例

2022-09-02 13:32:54

最终类和将类构造函数作为私有类之间到底有什么区别。

我知道两者都不能被子类化(如果我错了,请纠正我)。他们有什么区别吗?


答案 1

不能扩展最终类。它可以防止这种情况

final class FinalClass {

}

// and later

class ExtendedClass extends FinalClass { // ERROR

}

这对于像String这样的东西很有用 - 你不会希望有人能够覆盖String的逻辑,String是最常用的对象之一,并且能够,哦,我不知道,添加网络并将你使用的所有字符串发送回去。如果可以扩展 String,则可以执行此操作。

不能在类外部调用私有构造函数。

class PrivateCons {

    private PrivateCons() {

    }
}

// later
PrivateCons pc = new PrivateCons(); // ERROR

通常这最终会像这样工作:(java.lang.Math就是一个很好的例子)

class FuncLib {
    private FuncLib() { } // prevent instantiation
    public static void someFunc(...) { }
    public static int anotherFunc(...) { }
}

或者它最终像这样工作 // Integer 实际上就是这样做的

class VerySpecial {

    private static Map<String,VerySpecial> cache;

    public static VerySpecial generate(String data) {
        VerySpecial result = cache.get(data);
        if(result == null) {
            result = new VerySpecial(data);
            cache.put(data,result);
        }
        return result;
    }

    private String data;

    private VerySpecial() { }

    private VerySpecial(String data) { this.data = data}

}

扩展类时,默认情况下,构造函数会尝试调用默认(无参数)构造函数。如果它是私有的,那么在扩展非私有构造函数时必须显式调用它。如果没有要调用的非私有构造函数,则无法扩展它。感谢您的评论指出这一点。


答案 2

实例

  • 不能使用私有构造函数实例化类。但是,您可以将其用作具有静态方法的实用程序类。
  • 最终的类可以实例化,但不能扩展,显然你不能使用私有构造函数扩展类,因为隐式 super() 调用会失败。

看看数学类,它有一个私有构造函数,不能实例化,但它有很多静态方法,非常有帮助