2011-07-20 9 views
0

すでに定義されている変数を上書きしようとしています。ここで属性からのJava配列のロード

は私のコードです:

package com.diesal11; 

import java.lang.reflect.Array; 

public class Test{ 

private class List { 
    public String[] words; 

    public List(String[] array) { 
     this.words = array; 
    } 
} 

public List[] all; 

public Test() { 
    this.all = new List[2]; 
    String[] array = new String[2]; 

    array[0] = "One"; 
    array[1] = "Two"; 
    this.all[0] = new List(array); 

    array[0] = "Three"; 
    array[1] = "Four"; 
    this.all[1] = new List(array); 

    System.out.println(this.all[0].words[0]); 
    System.out.println(this.all[0].words[1]); 
    System.out.println(this.all[1].words[0]); 
    System.out.println(this.all[1].words[1]); 
} 

public static void main(String[] args) { 
    Test test = new Test(); 
} 

}

問題は、コンソールのプリントアウトです:

Three 
Four 
Three 
Four 

私はこれをどのように修正することができますか?このために必要な実際のコードはこのように設定されているため、あまり変更することはできません。

ありがとうございます!

答えて

2

問題は、Listコンストラクタに渡された配列への参照を格納することです。
次に、同じ配列を変更して2番目のListオブジェクトに渡します。代わりに

新しい配列を作成し、このようにそれを渡す:

... 
String[] array = new String[2]; 

array[0] = "One"; 
array[1] = "Two"; 
this.all[0] = new List(array); 

array = new String[2]; // CREATE A NEW ARRAY 
array[0] = "Three"; 
array[1] = "Four"; 
this.all[1] = new List(array); 
... 

EDITED - を追加しましたスタイル関連のフィードバックを

あなた大きな問題は、このコードは、たくさんのを持っていますスタイルの問題:

  • クラスと呼ばないでください:あなたはJDKからクラス名を使用しないでください、特にコレクションフレームワーク
  • からごMyListクラスstaticを行います。それは含んでいるクラスTestから任意のフィールドにアクセスする必要はありません - それはからDTO
  • ですデザインの視点から見ると、コードでは可変オブジェクトへの参照を保持するという問題が強調されています。オブジェクトに対して呼び出しコードが何をするかは制御できません(この場合、配列として)。

この問題を回避し、単純な変更は、この次のようになります - それは唯一の方法は、への参照を持って、その場で配列を作成します

static MyList { 
    String[] words; 

    public MyList(String... words) { 
     this.words = words; 
    } 
} 
... 
this.all[0] = new List("one", "two"); 

構文String... wordsが呼び出されるパラメータは、「可変引数」 (配列は渡すこともできますが、同じ問題があります)。 唯一の安全な方法は、配列のコピーを作成し、それを保存、またはあなたがにできる方法を提供に(例えば単語を保持するためのリストを使用して)単語を追加で

  • することです一般的に配列を避けるようにしてください - コレクションを使うことを好む
+0

ありがとうございました! しかし、コードはどのように迷惑メールですか?私は適切な書式とすべてを学びようとしています。見た目は分かりません! – Diesal11

+0

OK、あなたが質問して以来、私は説明します - 質問の編集を参照してください – Bohemian

+0

申し訳ありませんどこ?私は何も見ることができない? – Diesal11

0

this.allの2番目の要素に新しい配列を渡す必要があります。

String[] array = new String[2]; 

array[0] = "One"; 
array[1] = "Two"; 
this.all[0] = new List(array); 

array = new String[2]; 

array[0] = "Three"; 
array[1] = "Four"; 
this.all[1] = new List(array); 

同じメモリに変数arrayポイントあなたはListコンストラクタに渡すたびに。

0

2番目のインスタンスに新しいString []を作成する必要があります。最初のarrayを再利用することによって、同じアレイ内の要素を変更するだけで、all[0]all[1]の両方が参照されます。言い換えれば、all[0]all[1]はメモリ内の同じ場所を指します。コードの

String[] array = new String[2]; 
array[0] = "One"; 
array[1] = "Two"; 
this.all[0] = new List(array); 

String[] array = new String[2]; 
array[0] = "Three"; 
array[1] = "Four"; 
this.all[1] = new List(array); 

または保存するためのライン:

this.all[0] = new List(new String[] {"One", "Two"}); 
this.all[1] = new List(new String[] {"Two", "Three"}); 

はまた、あなたのクラスのいずれかの一般的なデータ型(java.util.List)と同じ名前を付けるのは悪い習慣です。これは混乱を招くでしょう。

+0

これは例であったので問題ではありませんでしたが、とにかく感謝しています! – Diesal11