有效的Java:使构造函数成为私有或包私有

时间:2016-03-17 15:01:40

标签: java inheritance factory final

Effective Java的第4章开始,给出了以下示例:

public class Complex { 
    private final double re; 
    private final double im;

    private Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }

    public static Complex valueOf(double re, double im) {
        return new Complex(re, im);
    }
    ... // Remainder unchanged
} 
  

[...]它是最灵活的,因为它允许使用多个包私有实现类。对于位于其包之外的客户,不可变类实际上是最终的,因为不可能扩展来自另一个包的类并且缺少公共或受保护的构造函数

我理解该课程有效final

但是没有声明final是否有任何实际优势?

当课程不支持扩展时省略此关键字似乎不太清楚如何传达API的使用方式。或者final只是在这里留下来向读者展示不可扩展的非最终类可能吗?

2 个答案:

答案 0 :(得分:4)

主要好处是限制继承范围。宣布它final将使它在任何地方都被封闭;但是,有时作为班级的作者,您希望在同一个包或类文件中继承class,但您不希望其他人也这样做。而这就是这个伎俩会做什么的。

改变一个可以继承的类(常用的API)是一场噩梦。如果可以限制继承范围,那么它就变成了一个简单的重构工作。

答案 1 :(得分:0)

这是优势: " ...它允许使用多个包私有实现类"

如果是最终的,则无法进行扩展(无论是在包内还是外包)。通过这种方式,您可以在扩展Complex的包内创建另一个类(假设构造函数是包私有的,即)。