You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类的构造方法中向数组添加新对象?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:15:36