【发布时间】:2013-09-27 04:25:15
【问题描述】:
晚上好。
我有一个相当复杂的问题。为了练习 Java,我一直在重新实现标准库中的一些数据结构。 Stacks、LinkedLists、Trees 等。我刚刚通过一个非常简单的示例确定,当使用peek() 或pop() 方法时,java.util.Stack 类执行深层复制。这是可以理解的,因为目标是保护课程内容免受外界干扰。到目前为止,在我自己的 Stack 实现中(一个简单的数组的幼稚实现,链表会在后面出现),我根本没有关心这个:
public class ArrayStack<T> implements Stack<T> {
private T[] data; // Will expand the array when stack is full.
private int top; // serves as both top and count indicator.
...
...
@Override
public T pop() throws EmptyStackException {
if(top == -1)
throw new EmptyStackException("Stack is empty.");
return data[top--]; // Shallow copy, dangerous!
}
不幸的是,由于无法实例化泛型,因此我不能假设复制构造函数并执行 return new T(data[top--]); 之类的事情clone() 的变体。 This 线程建议将类的签名扩展为:
public class ArrayStack<T extends DeepCloneableClass> implements Stack<T>
...
其中DeepCloneableClass 是一个实现允许“深度克隆”的接口的类(有关详细信息,请参阅该线程中的顶部响应)。当然,这种方法的问题在于,我真的不能指望String 或Integer 等标准类扩展我的自定义类,当然,我所有现有的 jUnit 测试现在都是在编译时抱怨,因为它们依赖于这样的整数和字符串堆栈。所以我觉得这个解决方案不可行。
This 线程建议使用第三方库来克隆几乎任何对象。虽然这个库似乎仍然受支持(最新的错误修复日期不到一个月前),但我宁愿不依赖第三方工具,而是使用 Java 可以为我提供的任何东西。原因是这些 ADT 的源代码有朝一日可能会与本科生共享,我不希望他们承担安装额外工具的负担。
因此,我正在寻找一种简单且尽可能有效的方法来维护通用 Java 数据结构的内部完整性,同时仍然允许与 pop()、peek()、popFront() 等方法的简单接口.
非常感谢您的帮助!
杰森
【问题讨论】:
标签: java oop generics clone type-safety