Назад к вопросам
Middle
70
questionbank
Как написать неизменяемый класс в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Чтобы сделать класс неизменяемым (immutable) в Java, нужно следовать нескольким принципам:
- Сделать класс
final, чтобы его нельзя было унаследовать и изменить поведение. - Сделать все поля класса
privateиfinal, чтобы их нельзя было изменить после инициализации объекта. - Не предоставлять методов-сеттеров (
setters). - Если класс содержит изменяемые поля (например,
ListилиDate), в геттерах нужно возвращать их копии, а не ссылки на оригинальные объекты. В конструкторе также принимать копии изменяемых объектов. - Переопределить методы
equals()иhashCode(), если это необходимо для корректного сравнения объектов и работы с коллекциями.
Пример:
// Final класс для предотвращения наследования
public final class ImmutablePerson {
// Private final поля
private final String name;
private final int age;
private final List<String> achievements;
// Конструктор, инициализирующий все поля.
// Для изменяемых полей создаются копии.
public ImmutablePerson(String name, int age, List<String> achievements) {
this.name = name;
this.age = age;
// Создание копии изменяемого списка
this.achievements = new ArrayList<>(achievements);
}
// Геттеры, возвращающие значения полей.
// Для изменяемых полей возвращается копия.
public String getName() {
return name;
}
public int getAge() {
return age;
}
public List<String> getAchievements() {
// Возвращение копии списка для предотвращения изменения извне
return new ArrayList<>(achievements);
}
// Переопределение equals и hashCode (опционально, но часто необходимо)
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ImmutablePerson that = (ImmutablePerson) o;
return age == that.age &&
Objects.equals(name, that.name) &&
Objects.equals(achievements, that.achievements);
}
@Override
public int hashCode() {
return Objects.hash(name, age, achievements);
}
}
Такой класс гарантирует, что после создания объекта его состояние (значения полей) не может быть изменено. Это дает преимущества в многопоточности, безопасности и упрощает разработку.