Какие классы являются неизменяемыми в Java
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Неизменяемые классы в Java
Неизменяемый (immutable) класс — это класс, экземпляры которого не могут быть изменены после создания. В Java множество встроенных неизменяемых классов, и разработчики часто создают свои неизменяемые типы для безопасности потоков и предсказуемого поведения.
Встроенные неизменяемые классы
Классы-обёртки примитивных типов:
Integer, Long, Double, Float, Boolean, Byte, Short, Character
Эти классы не предоставляют методов для изменения их значений после создания.
Строки и символы:
String, Character
Класс String — самый часто используемый неизменяемый класс в Java. При любой операции со строкой создаётся новая строка.
Классы больших чисел:
BigInteger, BigDecimal
Они представляют числа произвольной точности и не могут быть изменены.
Даты и время:
java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime
java.time.Instant, java.time.ZonedDateTime
Все классы из пакета java.time являются неизменяемыми (в отличие от старого java.util.Date).
Перечисления:
enum Status {
ACTIVE, INACTIVE, PENDING
}
Элементы enum являются неизменяемыми экземплярами.
Collections:
Collections.unmodifiableList(list)
Collections.unmodifiableMap(map)
Collections.unmodifiableSet(set)
List.of(), Map.of(), Set.of() // Java 9+
Как создать свой неизменяемый класс
public final class Person {
private final String name;
private final int age;
private final List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
// Создаём неизменяемую копию
this.hobbies = Collections.unmodifiableList(
new ArrayList<>(hobbies)
);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public List<String> getHobbies() {
return hobbies;
}
}
Правила создания неизменяемого класса
- Сделай класс
final— предотвратит наследование и переопределение методов - Все поля
private final— запретит изменение после инициализации - Инициализируй поля в конструкторе — не используй setters
- Для коллекций создавай копии — чтобы внешний код не мог изменить через ссылку
- Не предоставляй методы для изменения состояния — только геттеры
- Методы возвращают новые объекты — если нужна модификация
Пример неизменяемого класса с коллекциями
public final class Team {
private final String name;
private final List<String> members;
public Team(String name, List<String> members) {
this.name = name;
// Java 9+: используй List.copyOf
this.members = List.copyOf(members);
}
public String getName() {
return name;
}
// Возвращаем неизменяемую копию
public List<String> getMembers() {
return members;
}
// Возвращаем новый объект при изменении
public Team addMember(String member) {
List<String> newMembers = new ArrayList<>(members);
newMembers.add(member);
return new Team(name, newMembers);
}
}
Плюсы неизменяемых классов
- Безопасность потоков — не нужна синхронизация
- Простота отладки — состояние не меняется
- Использование как ключи в Map — hashCode не изменится
- Кэширование — одинаковые значения можно переиспользовать
- Понятность кода — никаких побочных эффектов
Минусы
- Использование памяти — нужны новые объекты для изменений
- Производительность — создание новых объектов стоит времени
- Complexity в некоторых случаях — нужны специальные техники
Неизменяемость — важный паттерн в современной Java, особенно при работе с многопоточностью.