2012-05-08 5 views
1

2つのカレンダーインスタンス(開始と終了)と他の多くの管理情報で作られたweekというクラスのインスタンスを基本的に含むこの時間コンテナを開発しています。関連する)whileループ内のカレンダーに関する問題

問題は私がwhileループでこれらのWeekインスタンスを作成することです、そして、私は週インスタンス(whileループでカレンダーミリ秒を印刷しています)の作成中に、週のリストの内容を確認してください、彼らはそうではありません!カレンダーのすべてのインスタンス(開始および終了)には、すべての週について同じ値が含まれます。

私はあなたたちは、問題を明確に理解できるように、コードのビットを書いている、クラス(コンテナとBiggerContainer)があります

public class Container 
{ 
    private static final long serialVersionUID = 1L; 

    private Calendar   start; 

    private Calendar   end; 

    public Container(Calendar start, Calendar end) 
    { 

    this.start = start; 
    this.end = end; 

    } 

    public Calendar getStart() 
    { 
    return start; 
    } 

    public Calendar getEnd() 
    { 
    return end; 
    } 
} 

Bigger container: 

    public class BiggerContainer 
{ 
    private static final long serialVersionUID = 1L; 

    private ArrayList<Container> containerList = new ArrayList<Container>(); 

    public void init() 
    { 

    int i = 0; 

    long max = 604800000; 

    long nu = Calendar.getInstance().getTimeInMillis(); 

    Calendar startC = Calendar.getInstance(); 

    Calendar endC = Calendar.getInstance(); 

    while (i <= 5) 
    { 

     startC.setTimeInMillis(nu); 
     endC.setTimeInMillis(nu + max); 
     System.out.println("At creation time: " + startC.getTimeInMillis() + "/" + endC.getTimeInMillis()); 
     containerList.add(new Container(startC, endC)); 

     nu += max; 
     i++; 
    } 
    } 

    public void show() 
    { 

    for (Container c : containerList) 
    { 

     System.out.println("Start millis: " + c.getStart().getTimeInMillis() + " end millis " 
      + c.getEnd().getTimeInMillis()); 
    } 
    } 

    /** 
    * TEST 
    * 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 

    BiggerContainer bc = new BiggerContainer(); 

    bc.init(); 

    bc.show(); 
    } 

} 

出力:

At creation time: 1336480993036/1337085793036 
At creation time: 1337085793036/1337690593036 
At creation time: 1337690593036/1338295393036 
At creation time: 1338295393036/1338900193036 
At creation time: 1338900193036/1339504993036 
At creation time: 1339504993036/1340109793036 


Start millis: 1339504993036 end millis 1340109793036 
Start millis: 1339504993036 end millis 1340109793036 
Start millis: 1339504993036 end millis 1340109793036 
Start millis: 1339504993036 end millis 1340109793036 
Start millis: 1339504993036 end millis 1340109793036 
Start millis: 1339504993036 end millis 1340109793036 

あなたが見ることができるようにinit()メソッドでのContainerインスタンスの作成中にCalendarインスタンスは正しい量のミリ秒を提供し、showメソッドではすべて同じミリ秒を出力します。

あなたは何か考えていますか? 私はそれが非常に新しい間違いであるという印象を持っていますが、どこが間違っているのかわかりません。

答えて

5

すべてのコンテナに対して同じカレンダーのインスタンス(startCとendC)を再利用しています。あなたのコンストラクタでカレンダーの "複製"/"コピー"を作成するか、ループ内にカレンダーインスタンスを作成します。

public Container(Calendar start, Calendar end) 
    { 

    this.start = (Calendar) start.clone(); 
    this.end = (Calendar) end.clone(); 
    } 

または

while (i <= 5) 
{ 
    Calendar startC = Calendar.getInstance(); 
    Calendar endC = Calendar.getInstance(); 
    startC.setTimeInMillis(nu); 
    endC.setTimeInMillis(nu + max); 
    System.out.println("At creation time: " + startC.getTimeInMillis() 
      + "/" + endC.getTimeInMillis()); 
    containerList.add(new Container(startC, endC)); 

    nu += max; 
    i++; 
} 
+0

ありがとう、私はそれは "単純な"解決策でしたが、なぜCalendar.setTimeInMillis()はカレンダーのMILLISECONDフィールドを変更しませんでしたか? – JBoy

+1

@JBoyです。問題は、すべてのコンテナに対して同じカレンダーを再利用していることです。ですから、setTimeInMillisで 'startC'(例えば)を変更すると、実際には' startC'を使っているので、すべてのコンテナでそれを変更しています。 –

+0

素晴らしい!ありがとう、ギョーム – JBoy

0

あなたは、あなたはカレンダーのインスタンスを再使用しても問題はありません

containerList.add(new Container(startC.getTime(), endC.getTime())); 

ようContainerオブジェクトにタイムスタンプを格納することができます。そしてこれは私が思うより効率的です。

関連する問題