Java不可变队列

Bha*_*Sai 0 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());
   }





}
Run Code Online (Sandbox Code Playgroud)

主要方法是:

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);
Run Code Online (Sandbox Code Playgroud)

界面是:

public interface ExamImmutableQueue<E> {
public ExamImmutableQueue<E> enqueue(E e);}
Run Code Online (Sandbox Code Playgroud)

UmN*_*obe 9

我将首先给你一个建议:把这些代码放在一边,重新开始.这在设计层面上似乎有什么问题:

  • 你不太明白什么是不可变对象.再读一遍.不可变意味着物体状态在施工后永远不会改变.
  • 您有几种公共方法,其中来自界面的合同只是"入队".
  • 你倾向于让方法做他们不希望做的事情.只打印的构造函数, setQueue它不会设置任何队列.至少要仔细选择你的名字.

方向:

  • litemp不应该是一个阶级领域.也许不应该存在.
  • 你需要对象内的最终字段.特别是收藏品liperm
  • 在构造函数中构造对象.什么都不做的构造函数可能没有它的位置
  • 你知道元素E是假设是可变的还是不可变的?这会对您可以做的事情产生影响.
  • 专注于实施enqueue.为了使事情变得更好,你也可以将Queue作为界面.

注意:一个不可变队列似乎对我没有意义(理论上给出了一个队列).在开始实施之前,再次询问此集合的用法.