[英]Immutable class using static factories
我正在学习Joshua Bloch的Effective Java,在那里他解释了实现不可变类的不同方法。 为了防止子类化,一种方法是使用final 。 更复杂的方法是将构造函数设为私有,从而防止外部访问,并使用静态工厂进行对象创建。
但是,我不明白这句话:
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);
}
}
它最灵活,因为它允许使用多个包私有实现类。
我理解外部客户端在没有公共/受保护构造函数的情况下将其子类化是不可能的,但是不理解术语“多包私有实现类”所传达的内容。
注意:这是Effective Java中的第15项(最小化可变性)。
据我记得约书亚然后谈论EnumSet (但我不记得他提到的背景)。
EnumSet
是抽象的,也有静态方法的 , noneOf等有两类扩展EnumSet
: JumboEnumSet
和RegularEnumSet
。
您不能直接使用它们,因为它们是包私有的(没有public
关键字):
class RegularEnumSet<E extends Enum<E>> extends EnumSet<E>
class JumboEnumSet<E extends Enum<E>> extends EnumSet<E>
java.util
包只能直接使用它们(如果我们不谈论反射或其他技术)。
您只需使用EnumSet
静态方法,它就会返回一些您不应该注意的EnumSet
子类。
看一下noneOf
方法实现:
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
这是多个包私有实现
类不能被子类化的唯一方法是将类标记为final
。 由于这个类不是final
, 所以它可以是子类 ,如下所示:
public class Complex {
private final double re;
private final double im;
private Complex(double re, double im) {
this.re = re;
this.im = im;
}
//methods...
static class SubComplex1 extends Complex {
private SubComplex1(double re, double im, double x) {
super(re, im);
//more elements...
}
//you can define/override methods here
}
public static Complex valueOf(double re, double im, double x) {
return new SubComplex1(re, im, x);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.