有效的Java:使构造函数私有或包私有
第4章给出了以下示例:有效的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) {
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我同意你的看法。以驻留在其包之外的客户机开头的句子有点误导,因为这也适用于同一包内但属于不同顶级类的客户机。我认为,如果构造函数是包私有的,或者如果文本明确说明只有嵌套类才能实际扩展它,那么这个例子会更有意义。