Можно ли сделать этот класс более неизменным?
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?
Редактировать:
Вот класс ученика, вопрос, который мне задали, чтобы описать необходимые изменения, чтобы сделать ученика неизменным. Я закомментировал оба метода установки, чтобы я мог сделать переменные окончательными. Это единственный способ сделать его действительно неизменным?
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; }
}
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; }
Неизменность вашего класса зависит исключительно от неизменности Student
учебный класс. Если Student
неизменен, то Tutor
неизменен и наоборот. Больше ничего не нужно для обеспечения неизменности Tutor
учебный класс.
По поводу видимости. Если ваш класс используется только внутри пакета, make является приватным (на уровне класса). Оставьте публичные методы публичными.
Immutables - это удобный набор инструментов для создания неизменяемых объектов в Java. Если вы создадите весь свой домен, используя его, он будет неизменным. Это берет вопрос "Является ли этот объект неизменным" из уравнения.