Java中LinkedList存储Jobs对象时被覆盖问题求助
问题根源与解决方案
问题原因
你遇到的元素被覆盖问题,核心原因是复用了同一个Jobs对象实例:
- 在
ServerSystem类中,jobStore是类成员变量,只会在ServerSystem实例化时创建一次。 - 每次收到JOB指令时,你只是修改这个同一个对象的属性值,然后将该对象的引用重复添加到
LinkedList中。 - 由于
LinkedList存储的是对象引用,列表中所有元素实际指向的是同一个Jobs实例,最终显示的自然都是最后一次修改的属性值。
解决方案
每次处理JOB指令时,创建新的Jobs对象,确保每个任务都对应独立的实例:
- 删除
ServerSystem类中的成员变量Jobs jobStore = new Jobs(); - 在JOB指令的处理代码块内,每次新建
Jobs对象并设置属性,再添加到列表中。
修改后的关键代码
public class ServerSystem extends Thread { // 移除类级别的jobStore变量 JobsManager jobManager = new JobsManager(); @Override public void run() { Nodes nodeClass = new Nodes(); NodesManager nodeManager = new NodesManager(); try { boolean repeat = true; while (repeat) { byte[] packetData = new byte[1024]; DatagramPacket packet = new DatagramPacket(packetData, packetData.length); socket.receive(packet); String message = new String(packetData); String[] elements = message.trim().split(","); switch (elements[0]) { case "JOB": // this is a job System.out.println("---> got a JOB instruction"); String jobTime = elements[1]; String jobNumber = elements[2]; if (Integer.parseInt(jobNumber) >= 11) { System.out.println("-----> Maximum job numbers reached"); break; } System.out.println("-----> Job Time = " + jobTime + ", Job Number = " + jobNumber); // 每次创建新的Jobs对象 Jobs jobStore = new Jobs(); jobStore.setJobNumber(jobNumber); jobStore.setJobTime(jobTime); jobManager.addJob(jobStore); break; } } System.out.println("Blocking incoming traffic..."); } catch (Exception error) { } } }
效果验证
修改后,LinkedList中的每个元素都是独立的Jobs实例,各自保存对应的任务编号和时间,不会再出现被最新值覆盖的情况。
内容的提问来源于stack exchange,提问作者MSinghD
相关产品推荐
相关产品推荐

