これは、私が昨日投稿した質問 (リンク) の続きです。その答えは、私が素晴らしいと答えたからです。間違いなく、障壁が解決されました。
アドバイスに従って、静的修飾子を削除しました。これにより、実際に、レコードへの累積的な変更の問題が解決されました。しかし、問題のデバッグ用に構築された単純化されたアプリケーションから元の環境に戻ると、レコードを追加すると以前のレコードが変更されることに気付きました。私がArrayListでやっているのは何か間違っていると思います。
すべてのstatic、final、およびsynchronized修飾子を (問題との関連性に関係なく)削除してアプリケーションを単純化しましたが、まだ問題があります。
問題を以下のaddメソッドに絞り込みました。このメソッドは、増分 ID フィールドとその他のフィールドのさまざまな値を持つテスト レコードを使用して、データ リポジトリのコンストラクターによって呼び出されます。
private ArrayList<taskDef> tasksTable = new ArrayList<taskDef>();
public void addTask (taskDef newRecord)
{ // Add the record at the array's end
Boolean f = tasksTable.add(newRecord);
System.out.println( "\n>************** storing record (index " + (getTasksTableLength () - 1) +
")\tProject: " + tasksTable.get(getTasksTableLength () - 1).getProjectNumber() +
"\tID: " + tasksTable.get(getTasksTableLength () - 1).getId() +
"\ttable size: " + getTasksTableLength () + "\tsuccess: " + f +
"\tLog: " + tasksTable.get(getTasksTableLength () - 1).getLog());
if (getTasksTableLength () > 1)
System.out.println( ">************** Previous record (index " + (getTasksTableLength () - 2) + "): " +
"\tProject: " + tasksTable.get(getTasksTableLength () - 2).getProjectNumber() +
"\tID: " + tasksTable.get(getTasksTableLength () - 2).getId() +
"\tLog: " + tasksTable.get(getTasksTableLength () - 2).getLog());
}
ログを見ると、レコードが追加されるたびに以前のタスクが変更されていることがわかります。次の出力では、以前のレコードが 1 つしか表示されていませんが、実際には以前のすべてのレコードが変更されています。
>************** storing record (index 0) Project: P1000 ID: 1 table size: 1 success: true Log:
11/07/2012 07:14:02: ; project number (P1000); task (Task 1); task ID (1); owner (O1); status (started)
>************** storing record (index 1) Project: P1000 ID: 2 table size: 2 success: true Log:
11/07/2012 07:14:41: ; task (Task 2); task ID (2); delivery flag (true)
>************** Previous record (index 0): Project: P1000 ID: 1 Log:
11/07/2012 07:14:41: ; task (Task 2); task ID (2); delivery flag (true)
>************** storing record (index 2) Project: P1000 ID: 3 table size: 3 success: true Log:
11/07/2012 07:16:08: ; task (Task 3); task ID (3); owner (O2)
>************** Previous record (index 1): Project: P1000 ID: 2 Log:
11/07/2012 07:16:08: ; task (Task 3); task ID (3); owner (O2)