gpt4 book ai didi

java - 在自己的构造函数中使用对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:21:34 24 4
gpt4 key购买 nike

是否有可能(或明智地)在它自己的构造函数中使用一个对象?(对于表述不当的菜鸟问题感到抱歉)

假设我有一个类“Students”,它包含一个子类 Student 的数组列表和一个将新学生添加到数组的方法。

我可以在我的 Student 构造函数中使用 addStudent 方法在创建时将新实例添加到数组吗?...像这样:

//Students
class Students{
private static ArrayList<Student> STUDENTS = new ArrayList<>();
public static void addStudents(Student student){
STUDENTS.add(student);
}
}
//Student
class Student /*extends Students <- old misstake left for reference*/{
private String name = "";
private int birthYear = 0;

Student(String _name, int _birthYear){
this.name = _name;
this.birthYear = _birthYear;
//insert wild guess
Students.addStudents(this(name,birthYear));
}
}

或者这会简单地循环并创建大量对象直到一切崩溃吗?

最佳答案

你可以;你只是不应该。

一个原因是您可能并不总是希望将所有 Student 实例添加到同一个共享列表中。例如,如果您在单元测试中创建 Student 实例,并将它们添加到构造函数中的 Students 列表中,则您必须担心在之后清除列表测试,以避免在测试之间意外共享状态。

另一个原因是在构造函数中添加实例被称为不安全发布。您正在给出对尚未完全初始化的实例的引用。这可能会导致一些非常棘手的错误,尤其是与并发相关的错误。

在你对它做任何事情之前,你应该一直等到一个实例完全初始化(即一个 new Whatever 已经返回)。

您最好将创建 Student 与添加到 Students 列表分离。使用工厂方法创建学生:

class Students{
private static ArrayList<Student> STUDENTS = new ArrayList<>();
public static void addStudents(Student student){
STUDENTS.add(student);
}

// Factory method.
public static Student createAndAddStudent(String name, int birthYear) {
Student student = new Student(name, birthYear);
addStudents(student);
return student;
}
}

就您当前的代码而言,您不需要extends Students。从逻辑上讲,Student 不是 Students,就像 Car 不是 Cars(比如大声说出来;只是没有意义)。

您需要做的就是调用静态方法:

class Student {
Student() {
// ...
Students.addStudents(this);
// ...
}
}

关于java - 在自己的构造函数中使用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com