我看到了下面的代码,想知道每个 Tree 实例是否会引用不同的 EMPTY 对象,或者它是否会为所有树实例引用相同的对象(仅实例化一次)。
class Tree<T> {
public final Tree<T> EMPTY = new EmptyTree<T> ();
/** True iff THIS is the empty tree. */
public boolean isEmpty () { return false; }
private static class EmptyTree<T> extends Tree<T> {
/** The empty tree */
private EmptyTree () { }
public boolean isEmpty () { return true; }
}
...
}
我的直觉是它必须是“public static final....”才能在整个类中为 EMPTY 初始化一个对象。
最佳答案
你是对的。此代码每次都使用一个新的 EMPTY 对象。
这当然是有效的,但不是“正常”的事情。当然,我是那些说 static 实际上是好的 OO 设计中的异常的人之一;但是Java语言允许使用static;并且(除非在此处未显示的代码中有充分的理由)......合理的方法是拥有一个共享静态 EMPTY Tree 常量。
但是该代码无论如何看起来都很奇怪 - 例如,isEmpty()
方法总是返回 false 的“意义”是什么?!
我的“直觉”是:我会退后一步,全面审查该代码,以了解该类中是否有“更多”惊喜。
关于Java:某些东西被初始化的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40852807/