gpt4 book ai didi

java - 这个类可以变得更加不可变吗?

转载 作者:行者123 更新时间:2023-12-01 07:54:26 25 4
gpt4 key购买 nike

package main;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public final class Tutor {

private final String name;
private final Set<Student> tutees;

public Tutor(String name, Student[] students) {
this.name = name;
this.tutees = new HashSet<Student>();
for (int i = 0; i < students.length; i++) {
tutees.add(students[i]);
}
}

public Set<Student> getTutees() { return Collections.unmodifiableSet(tutees); }

public String getName() { return name; }

}

是否可以做更多事情来使此类不可变?字符串已经是不可变的,返回的集合是不可修改的。学生和姓名变量是私有(private)的和最终的。还能做什么?如果使用 Tutor 类的唯一类在包内,我可以将构造函数、 getTutees 方法和 getName 方法更改为包私有(private)吗?

编辑:

这是 Student 类,问题要求我描述必要的更改,以使 Student 不可变。我已经注释掉了两个 setter 方法,这样我就可以将变量设为最终的。这是使其真正不可变的唯一方法吗?

public final class Student {   
private final String name;
private final String course;

public Student(String name, String course) {
this.name = name;
this.course = course;
}

public String getName() { return name; }

public String getCourse() { return course; }

//public void setName(String name) { this.name = name; }

//public void setCourse(String course) { this.course = course; }
}

最佳答案

作为一个小优化,您可以使 tutees 不可变,因此它甚至无法在 Tutor 内部更改。

public Tutor(String name, Student[] students) {
this.name = name;
Set<Student> tuts = new HashSet<>();
for (Student student : students) {
tuts.add(student);
}
this.tutees = Collections.unmodifiableSet(tuts);
}
public Set<Student> getTutees() { return this.tutees; }

较短的版本:

public Tutor(String name, Student[] students) {
this.name = name;
this.tutees = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(students)));
}
public Set<Student> getTutees() { return this.tutees; }

关于java - 这个类可以变得更加不可变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32108737/

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