如何在类的构造方法中向数组添加新对象?
解决Tasks对象添加到数组的无限循环问题
你的问题核心是构造函数内调用new Tasks(...)触发了无限递归——每次创建Tasks对象时,构造函数又会新建一个Tasks实例,反复调用直到栈溢出。下面是几种合理的优化实现:
方案1:外部创建对象后手动加入数组
保持原构造函数的纯粹性,只负责初始化对象属性,数组添加逻辑放到外部代码中:
// 原构造函数不变 public Tasks(int linkToDiolog, int reward, Weapon weapon, int q) { this.linkToDiolog = linkToDiolog; this.reward = reward; this.weapon = weapon; this.q = q; } // 外部调用示例 Tasks newTask = new Tasks(1, 100, new Weapon("Iron Sword"), 0); listOfTasks[0] = newTask;
方案2:用静态工厂方法封装创建+添加逻辑
如果想把对象创建和数组添加的逻辑封装在一起,用静态方法替代构造函数内的递归调用:
// 构造函数可以设为私有,强制通过工厂方法创建 private Tasks(int linkToDiolog, int reward, Weapon weapon, int q) { this.linkToDiolog = linkToDiolog; this.reward = reward; this.weapon = weapon; this.q = q; } // 静态工厂方法:创建对象并加入数组 public static Tasks createAndAddToList(int linkToDiolog, int reward, Weapon weapon, int q) { Tasks task = new Tasks(linkToDiolog, reward, weapon, q); // 确保listOfTasks已初始化且q在合法索引范围内 if (q >= 0 && q < listOfTasks.length) { listOfTasks[q] = task; } return task; } // 调用方式 Tasks newTask = Tasks.createAndAddToList(1, 100, new Weapon("Iron Sword"), 0);
方案3:构造函数内直接将当前实例加入数组
如果必须在构造阶段完成添加,直接用this(当前正在创建的实例)而非新建对象:
public Tasks(int linkToDiolog, int reward, Weapon weapon, int q) { this.linkToDiolog = linkToDiolog; this.reward = reward; this.weapon = weapon; this.q = q; // 注意:listOfTasks建议设为静态变量,否则每个Tasks实例都会持有数组引用 if (q >= 0 && q < listOfTasks.length) { listOfTasks[q] = this; } }
注意事项
- 必须确保
listOfTasks数组已经完成初始化,避免空指针异常 - 添加前校验
q的范围,防止数组越界 - 更推荐的设计是把数组管理交给专门的任务管理类(比如
TaskManager),让Tasks类只负责封装自身属性,符合单一职责原则
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

