1

私はこの時間コンテナを開発しています。これは基本的に、2 つの Calendar インスタンス (開始と終了) とその他の多くの管理情報 (現時点では関係ありません) で構成される、week と呼ばれるクラスのインスタンスを含みます。

問題は、これらの Week インスタンスを while ループで作成することです。week インスタンスの作成中 (while ループでカレンダーのミリ秒を出力する)、ミリ秒は問題ないことがわかりますが、リストの内容を確認すると数週間、そうではありません!Calendar のすべてのインスタンス (開始と終了) には、すべての週について同じ値が含まれています。

皆さんが問題を明確に理解できるように、少しコードを書きました。クラス (Container と 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 メソッドでは、それらはすべて同じミリ秒を出力します...

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

4

2 に答える 2

5

すべてのコンテナーに対して同じ Calendar インスタンス (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++;
}
于 2012-05-08T13:01:59.467 に答える
0

Container次のようなオブジェクトにタイムスタンプを保存できます

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

そうすれば、カレンダーインスタンスの再利用に問題はありません。そして、これは私が思うようにもっと効率的になるでしょう。

于 2012-05-08T13:04:05.143 に答える