Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有效的Java:使构造函数私有或包私有_Java_Inheritance_Factory_Final - Fatal编程技术网

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

有效的Java:使构造函数私有或包私有,java,inheritance,factory,final,Java,Inheritance,Factory,Final,第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) {

第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
有什么实际好处吗?

当类不支持扩展时,省略这个关键字似乎是传达
API
如何使用的不太清楚的方式。或者
final
仅仅是为了向读者展示不可扩展、非final类是可能的吗?

这是优点: “…它允许使用多个包专用实现类”


如果它是最终的,扩展将是不可能的(在包内或包外)。通过这种方式,您可以在包内创建另一个扩展复杂的类(前提是构造函数是包私有的)。

主要好处是限制继承的范围。宣布它是最终的将使它到处密封;但是,有时作为类的作者,您希望继承同一个包或类文件中的
,但不希望其他人也这样做。这就是这个把戏的作用


更改为继承而打开的类(常用的API)是一场噩梦。如果您可以限制继承的范围,那么它将成为一个简单的重构工作。

它允许使用多个包私有实现类
,这不是finalb的行为,但构造函数仍然是私有的。这意味着只有嵌套类才能真正扩展这个类。那么,对于同一个包中的其他顶级课程来说,这不是最后一次吗?@flkes我同意你的看法。以驻留在其包之外的客户机开头的句子有点误导,因为这也适用于同一包内但属于不同顶级类的客户机。我认为,如果构造函数是包私有的,或者如果文本明确说明只有嵌套类才能实际扩展它,那么这个例子会更有意义。