1

私はまだJavaで非推奨のsetYear()をカレンダープログラムに使用していますが、どういうわけか同じ年が次のように表示されます。

12月21日水曜日00:00:00CST2022

12月21日水曜日00:00:00CST2022

12月21日水曜日00:00:00CST2022

//loop in another method
for (int i = realYear-1900; i <= realYear-1900+10; i++){
    date.setYear(i);
    vectorEvents.add(new Event(date, title));
}
textArea.setText(displayEvents());

//events method
public String displayEvents(){
    String data ="";
    Event e;
    for(int i=0; i<vectorEvents.size(); i++){
        e =  vectorEvents.get(i);
        data += e.date + "\n";
    }
    return data;
}

最初の日付を追加してから表示し、2番目の日付を追加してからもう一度表示してみました。最初のデートは2番目のデートと同じように最新の年に変更されているようです。これに対する別の解決策がありますか、それとも何か問題がありますか?ありがとうございました。

4

2 に答える 2

2

同じオブジェクトをベクトルに10回追加していますDate(これはもう使用しないでください、ところで)。したがって、ループの最後で、ベクトル内のすべての参照は、設定した最後の年を含む同じDateオブジェクトを指します。

各反復で新しい日付をインスタンス化する必要があります。

for (int i = realYear-1900; i <= realYear-1900+10; i++){
    Date copy = new Date(date.getTime());
    copy.setYear(i);
    vectorEvents.add(new Event(copy, title));
}
于 2012-12-09T17:18:54.107 に答える
1

DateオブジェクトはJavaで変更可能であり、他の人が指摘しているように、1つのインスタンスのみを使用して変更しています。

オブジェクトがあなたのものである場合、Event長期的な最善の解決策は、コンストラクターを変更し、Date渡されたもののコピーを作成することです(「EffectiveJava」のBruce Eckelの観点から防御コピーを作成します)。

public Event(Date d, String title) {
    this.date = new Date(d.getTime());
    this.title = title
}

titleは不変なので、同じことをする必要がないことに注意してくださいString

于 2012-12-09T17:24:41.490 に答える