我想编写一个通用类,它是具有基本的Push和Pop操作的先进先出队列,这是该类:
class queue<E>
{
protected final class elem
{
public E val;
public elem next=null;
public elem(){}
public elem(E v)
{
val=v;
}
}
protected elem head=null,tail=null;
public queue()
{
}
public queue(E v)
{
head=new elem(v);
}
public void push(E v)
{
if(head==null)
head=tail=new elem(v);
else if(head==tail)
{
tail=new elem(v);
head.next=tail;
}
else
{
elem t=new elem(v);
tail.next=t;
tail=t;
t=null;
}
}
public final E peek()
{
return ((tail!=null)?tail.val:null);
}
public E pop()
{
if(head==null)
return null;
E i=head.val;
if(head!=tail)
head=head.next;
else
head=tail=null;
return i;
}
}
问题出在这里的elem构造函数中:
public elem(E v)
{
val=v;
}
我不想将v分配给val,但我想克隆它(浅拷贝)。
这是我尝试过的事情:
1- clone方法:很好,因为它在Object类中受保护,所以我无法从E变量访问它。
2-
queue<E extends Cloneable>
:没有解决问题,实际上Cloneable是一个空接口,它没有添加任何方法。3-使用优先级队列:这可能比自己编写队列类要容易,但是我不希望优先级高,而只需要Fifo结构。
4-实现队列接口:在其中必须实现许多我不需要的许多方法,而且我仍然必须自己克隆。
那么,接下来要尝试什么?
最佳答案
您可以创建接口CustomCloneable
:
interface CustomCloneable {
public CustomCloneable clone();
}
并根据您的情况使用它。请注意,您将必须为您的类提供克隆实现或使用下面描述的方法/库。
class Queue<E extends CustomCloneable>
然后,您可以在您的计算机上调用
clone
方法public Elem(E v) {
val = (E) v.clone();
}
另一方面,您可能正在寻找其他东西。 Refer here有关其他选项,以及为什么应避免克隆。
取而代之的是使用其他一些选项,例如apache-commons [
SerializationUtils
] [1](深克隆)或BeanUtils
(浅克隆),或者仅使用复制构造函数。另请阅读java code conventions