gpt4 book ai didi

Java 不可变队列

转载 作者:行者123 更新时间:2023-12-01 06:46:13 24 4
gpt4 key购买 nike

在下面的代码中,我有两个链接列表 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com