0

以下のコードには、liperm と litemp の 2 つのリンク リストがあります。最初に 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);}
4

3 に答える 3

9

私はあなたにアドバイスをすることから始めます:このコードを脇に置いて、新たに始めてください。ここで設計レベルで間違っていると思われるもの:

  • 不変オブジェクトとは何かをよく理解していません。もう一度読んでください。不変は、オブジェクトの状態が構築後に変更されないことを意味します。
  • インターフェイスからのコントラクトが「エンキュー」のみであるパブリック メソッドがいくつかあります。
  • メソッドに期待されていないことをさせる傾向があります。setQueueキューを設定しない、印刷のみを行うコンストラクター 。少なくとも名前は慎重に選んでください。

方向 :

  • litempクラスフィールドであってはなりません。多分存在しないはずです。
  • オブジェクト内に final フィールドが必要です。特にコレクションliperm
  • コンストラクターでオブジェクトを構築します。何もしないコンストラクタは、その場所を持っていないかもしれません
  • E要素が可変または不変であると想定されているかどうか知っていますか? これにより、できることが変わります。
  • の実装に集中しますenqueue。物事を良くするために、Queueをインターフェイスとして使用することもできます。

注:不変のキューは私には意味がないようです(キューが理論的に何であるかを考えると)。実装に飛び込む前に、このコレクションの使用法をもう一度確認してください。

于 2012-08-28T14:59:34.673 に答える