Java 不可变队列

标签 java immutability

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

相关文章:

java - 难以理解 Intent 如何运作

java - 创建一个不可变的类

domain-driven-design - DDD : how to keep a complex value object immutable?

java - 在java中从xml设置数字

java - 我使用 ReentrantReadWriteLock 有什么问题吗?

java - 使用带有字符串分割器的扫描仪

javascript - redux:使用不可变方法修改数组中对象的属性的性能。优点和缺点

java - Java中可变对象的封装

javascript - Eloquent JavaScript : immutable string values

java - 如何在不解码整个图像的情况下知道 jpeg 格式 (android)