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; }
}
还有更多可以使这个类不可变吗?字符串已经是不可变的,该集合返回不可修改。学生和名称变量是私有的和最终的。还有什么可以做的?如果使用Tutor类的唯一类在包中,我可以将构造函数,getTutees方法和getName方法更改为package-private吗?
编辑:
这是学生班,这个问题要求我描述必要的修改,也让学生不变。我已经注释掉了两个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; }
}
答案 0 :(得分:3)
作为次要优化,您可以使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; }
答案 1 :(得分:2)
你的班级&#39;不变性完全取决于Student
类的不变性。如果Student
是不可变的,则Tutor
是不可变的,反之亦然。没有必要确保Tutor
类的不变性。
关于可见性。如果您的类仅在包中使用,则make为package-private(在类级别)。公开方法公开。
答案 2 :(得分:1)
Immutables是一个方便的工具包,用于在Java中创建不可变对象。如果使用它构建整个域,它将是不可变的。它需要的问题是“这个对象是不可变的吗?”超出等式。