加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:39:44 所属栏目:Java 来源:网络整理
导读:在它自己的构造函数中使用对象是否可能(或明智)?(对于制作不当的noob问题抱歉) 假设我有一个“学生”类,其中包含子类Student的arrayList和一个将新学生添加到数组的方法. 我可以在我的Student构造函数中使用addStudent方法在创建时将新实例添加到数组中吗?
在它自己的构造函数中使用对象是否可能(或明智)?(对于制作不当的noob问题抱歉)

假设我有一个“学生”类,其中包含子类Student的arrayList和一个将新学生添加到数组的方法.

我可以在我的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列表中,则必须担心在测试后清除列表,以避免在测试之间意外共享状态.

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

在执行任何操作之前,您应该始终等待实例完全初始化(即一个新的Whatever返回).

您最好将创建学生与添加到学生列表中脱钩.使用工厂方法创建学生:

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;
  }
}

就您当前的代码而言,您不需要扩展学生.从逻辑上讲,学生不是学生,不仅仅是汽车不是汽车(大声说出来;它只是没有意义).

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读