为 说 明 匿 名 类, 我 们 编 写 了 BinarySearchTree 的 keys 和 elements 方 法, 它 们 都 用 来 返 回 一 个BSTEnumerator 对 象, 如 下 所 示。
private Enumeration doEnumerate(final boolean k) {
return new Enumeration() {
private BSTNode currentNode = rootNode;
private boolean keys = k;
public boolean hasMoreElements() {
return (currentNode != null);
}
public Object nextElement() {
if (currentNode == null)
throw new NoSuchElementException();
BSTNode n = currentNode;
currentNode = n.successor();
return (keys n.key : n.payload);
};
}
public Enumeration elements() {
return doEnumerate(false);
}
public Enumeration keys() {
return doEnumerate(true);
}
仔 细 看 一 下doEnumerate 函 数; 有 两 样 事 情 比 较 奇 怪。 第 一, 它 返 回 接 口 的 新 的 实 例; 其 次, 它 前 面 的 参 数k 是final 型 的。 到 底 是 怎 么 回 事 呢 ? 答 案 是 这 种 技 术 是 使 用 内 嵌 类 的 又 一 方 法。
返 回 说 明 看 起 来 是 建 立 了 一 个 新 的 接 口 实 例, 但 事 实 上 是 建 立 了 一 个 没 有 明 确 名 字 并 且 实 现 了 接 口 的 新 类。 在 这 种 情 况 下, 实 际 上 的 名 字 是BinarySearchTree$1, 但 它 只 对 编 译 器 的 作 者 有 意 义。
用 这