在下面的代码中,我有两个链接列表 liperm 和 litemp。我想首先使用 liperm 的值初始化 litemp,然后添加其他值。但它不起作用,因为它没有初始化它们。您能帮忙吗:
public class ExamImmutableQueueImpl<E> implements ExamImmutableQueue<E> {
LinkedList<E> liperm = new LinkedList<E>();
LinkedList<E> litemp = new LinkedList<E>(liperm);
public ExamImmutableQueueImpl(LinkedList li){
System.out.println(li.toString());
}
public ExamImmutableQueueImpl(){}
@Override
public ExamImmutableQueue<E> enqueue(E e) {
System.out.println(litemp.toString());
litemp.add(e);
return new ExamImmutableQueueImpl<>(litemp);
}
public final void setQueue(E e){
liperm.add(e);
}
public void getQueue(){
System.out.println(litemp.toString());
}
}
主要方法是:
public static void main(String args[]){
ExamImmutableQueueImpl<Integer> o1 = new ExamImmutableQueueImpl<Integer>();
ExamImmutableQueue<Integer> obj;
o1.setQueue(2);
o1.setQueue(1);
o1.setQueue(2);
o1.setQueue(3);
obj = o1.enqueue(6);
界面是:
public interface ExamImmutableQueue<E> {
public ExamImmutableQueue<E> enqueue(E e);}
最佳答案
我首先给你一个建议:把这段代码放在一边并重新开始。 在设计层面上似乎有什么问题:
- 你不太明白什么是不可变对象(immutable对象)。再读一遍。不可变意味着对象状态在构造后永远不会改变。
- 您有几个公共(public)方法,其中接口(interface)的契约仅是“入队”。
- 您倾向于让方法执行它们不期望执行的操作。仅打印
setQueue
的构造函数,它不设置任何队列。至少要仔细选择你的名字。
路线:
litemp
不应是类字段。也许不应该存在。- 您的对象内需要最终字段。尤其是
liperm
系列 - 在构造函数中构造对象。不执行任何操作的构造函数可能没有它的位置
- 您知道元素
E
是否被假定为可变或不可变吗?这会对您的能力产生影响。 - 专注于实现
入队
。为了让事情变得美好,您还可以 Queue作为接口(interface)。
注意:不可变队列对我来说似乎没有任何意义(考虑到队列理论上是什么)。在开始实现之前再问一下这个集合的用途是什么。
关于Java 不可变队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161317/