我正在研究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);
}
}
它最灵活,因为它允许使用多个包私有实现类。
我知道在没有公共/受保护的构造函数的情况下,外部客户端不可能对其进行子类化,但不了解术语“多包私有实现类”所传达的内容。
注意:这是有效Java中的第15项(最小化可变性)。
如果类被标记为<code>final</code>,则类不能被子类化。由于该类不是<code>final</code>,因此可以将其子类化,如下所示:
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);
}
}
据我所知,约书亚随后谈到了EnumSet(但我不记得他提到它的上下文)。
EnumSet
是抽象的,也有静态方法、noneOf等。有两个类扩展枚举集
: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);
}
下面是多个包私有实现
在Java中是否有一个静态工厂方法来创建队列? 或 但无法找到对队列(或出队列)进行同样操作的方便方法。我找到的唯一解决办法是:
问题内容: 我熟悉静态工厂方法的概念和好处,如Joshua Bloch的EffectiveJava中所述: 工厂方法具有名称,因此与构造函数不同,您可以拥有多个具有相同签名的工厂方法。 工厂方法不必创建新的对象。他们可以返回先前创建的对象。这对于不可变对象或值对象很有用。 与构造方法不同,工厂方法可以返回其返回类型的任何子类型的对象。 现在,我正在尝试为正在学习Java和OO原理的人员解释静态工厂
考虑一个场景,我想用一些数据获取,并将其解析为特定类型的对象,例如。免责声明:虽然很长,但这是一个sscce;我的实际项目与猫的声音关系不大:) 要求: 第一个字符表示“动物的类型”。所以 可能指抽象, 可能指。 第二个字符可选地表示“动物的亚型”...除了这些子类型被分组到类别中(就类而言)。所以CS可能是ThaiCat扩展Cat与参数“”,可能是扩展Cat与参数,可能是扩展与参数 中包含其他信
问题内容: 首先,如果这是一个非常愚蠢的问题,请原谅我,我只是想学习这种语言的核心。我正在阅读《有效的Java》,并且第一章讨论了静态工厂方法与构造方法。他们的利弊。令我困惑的几件事是: 静态工厂方法返回的对象的类是非公共的 -究竟是什么意思? 与构造函数不同,每次调用静态工厂方法都不需要创建新对象 -这是怎么发生的?我仅调用工厂方法来获取新对象,是否将检查方法放入工厂方法中以检查对象是否已存在?
问题内容: Python中是否可以有静态类变量或方法?为此需要什么语法? 问题答案: 在类定义内声明但在方法内声明的变量是类或静态变量: 正如@ millerdev指出的那样,这将创建一个类级别的i变量,但这不同于任何实例级别的i变量,因此你可以 这与C ++和Java不同,但与C#并没有太大区别,在C#中,无法使用对实例的引用来访问静态成员。
问题内容: 我的应用程序有一个问题,当我登录时,该应用程序崩溃并且出现错误: 我试图弄乱gradle并更改变量。这个问题似乎源于此软件包: 然后,它还引用了以下内容: 这是我的摇篮 关于如何找到纠正错误的方法有任何想法吗? 问题答案: 尝试切换到Java 8兼容性,以对某些库进行适当的除糖处理: 此外,Google JSON API可能更需要。