【问题标题】:Erroneous update of ArrayList records when a new record is added添加新记录时错误更新 ArrayList 记录
【发布时间】:2012-07-09 09:18:54
【问题描述】:

我正在尝试创建一个任务表并操作其内容。我正在处理一个我不理解的错误,非常感谢您的帮助。我同意问题的长度,但尽量提供尽可能多的细节。

tasksRepository 类将taskDef 类中构造的记录存储为数组列表。 setTask () 和 getTask 方法包含 ArrayList 类的 add() 和 get() 方法。

taskDef 对象的参数是使用本地设置方法创建的。下面是这种方法的一个例子:如果传递的参数与存储的值不同,它将被存储值,并且事件将被添加到日志记录中。在任何情况下,都会重新调整成功标志。

public static Boolean setProjectNumber(String projectNumberI)
{ // All the 
    if (projectNumberI != projectNumber)
    {
        projectNumber = projectNumberI;
        logAccumulator = logAccumulator + "; project number (" + projectNumberI + ")";
    }
    return true;
}

private static void setLog ()
{ // When all the parameters are set, the log parameter is updated with time tag
    String t = formatterFull.format(GregorianCalendar.getInstance().getTime());
    log = log + "\n" + t + ": " + logAccumulator;       
}

tasksTableProcessing 类包含任务操作。以下包含构造函数。它以更简单的形式开始,但在调查期间我改变了它。 taskStatus 类是返回字符串的 ENUM。 getLog () 方法只是简单地返回日志字段

public tasksTableProcessing () 
{ // constructor. Creates the tableRepository object with test records
    tasksRepository.clearDb ();

    taskDef task = null; 
    task = new taskDef ("P1000", "O1", taskStatus.started (), "1", "false", "false");
    tasksRepository.addTask (task);
    System.out.println("\nLog 0: \n" + tasksRepository.getTask(0).getLog());

    task = null;
    task = new taskDef ("P1000", "O1", taskStatus.started(), "2", "false", "true");
    tasksRepository.addTask (task);
    System.out.println("\nLog 1: \n" + tasksRepository.getTask(1).getLog());

    task = null;
    task = new taskDef ("P2000", "O2", "closed", "63", "true", "false");
    tasksRepository.addTask (task);
    System.out.println("\nLog 2: \n" + tasksRepository.getTask(2).getLog());

    task = null;
    task = new taskDef ("P2000", "O2", "closed", "64", "true", "true");
    tasksRepository.addTask (task);
    System.out.println("\nLog 3: \n" + tasksRepository.getTask(3).getLog());
}

以下是日志。它表明当引入新记录时,所有旧记录都会更新。

日志 0:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始)

日志 1:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始);任务(任务 2);任务 ID (2);交货标志(真)

日志2:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始);任务(任务 2);任务 ID (2);交货标志(真)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始);任务(任务 2);任务 ID (2);交货标志(真);项目编号(P2000);任务(任务 63);任务 ID (63);所有者(O2);状态(关闭);关键路径(真);交货标志(假)

日志 3:

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始);任务(任务 2);任务 ID (2);交货标志(真)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始);任务(任务 2);任务 ID (2);交货标志(真);项目编号(P2000);任务(任务 63);任务 ID (63);所有者(O2);状态(关闭);关键路径(真);交货标志(假)

09/07/2012 10:21: ;项目编号(P1000);任务(任务 1);任务 ID (1);所有者(O1);状态(开始);任务(任务 2);任务 ID (2);交货标志(真);项目编号(P2000);任务(任务 63);任务 ID (63);所有者(O2);状态(关闭);关键路径(真);交货标志(假);任务(任务 64);任务 ID (64);交货标志(真)

【问题讨论】:

  • 很好的背景,但我不确定我能看出问题出在哪里。
  • 能否展示taskDef的构造函数和taskRepository.addTask(task)的定义代码?

标签: java arraylist


【解决方案1】:

给定方法签名,您将 TaskDef 的成员存储为静态字段,而不是实例字段。静态字段是类 TaskDef 本身的字段,而不是特定 TaskDef 实例的字段。

阅读有关 instance and class members 的 Java 教程。

【讨论】:

  • 非常感谢:删除静态声明(过去由于一些编译问题而添加)完全解决了问题
猜你喜欢
  • 2022-01-06
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多