晚上好。
我有一个相当复杂的问题。为了练习 Java,我一直在重新实现标准库中的一些数据结构。Stacks、LinkedLists、Trees 等。我刚刚通过一个非常简单的示例确定,当使用or方法时,java.util.Stack
该类执行深层复制。这是可以理解的,因为目标是保护课程内容免受外界干扰。到目前为止,在我自己的 Stack 实现中(一个简单的数组的幼稚实现,链表将在后面出现),我根本不关心这个:peek()
pop()
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--]);
我在 SO 中一直在寻找的东西,并且我发现了两个相关线程,它们试图通过使用clone()
. 该线程建议将该类的签名扩展到:
public class ArrayStack<T extends DeepCloneableClass> implements Stack<T>
...
在哪里DeepCloneableClass
是一个实现允许“深度克隆”的接口的类(有关详细信息,请参阅该线程中的顶部响应)。当然,这种方法的问题在于,我不能真正期望标准类,例如String
或Integer
扩展我的自定义类,当然,我所有现有的 jUnit 测试现在都在编译时抱怨,因为它们依赖于这样的整数和字符串堆栈。所以我不觉得这个解决方案是可行的。
该线程建议使用第三方库来克隆几乎任何对象。虽然这个库似乎仍然受支持(最新的错误修复日期不到一个月前),但我宁愿不依赖第三方工具,而是使用 Java 可以为我提供的任何东西。这样做的原因是这些 ADT 的源代码有朝一日可能会与本科生共享,我不希望他们承担安装额外工具的负担。
因此,我正在寻找一种简单且(如果可能的话)有效的方法来维护通用 Java 数据结构的内部完整性,同时仍然允许与方法的简单接口,例如pop()
,peek()
、popFront()
等方法的简单接口。
非常感谢您的帮助!
杰森