← Назад к вопросам

Какие классы являются неизменяемыми в Java

1.0 Junior🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Неизменяемые классы в 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;
    }
}

Правила создания неизменяемого класса

  1. Сделай класс final — предотвратит наследование и переопределение методов
  2. Все поля private final — запретит изменение после инициализации
  3. Инициализируй поля в конструкторе — не используй setters
  4. Для коллекций создавай копии — чтобы внешний код не мог изменить через ссылку
  5. Не предоставляй методы для изменения состояния — только геттеры
  6. Методы возвращают новые объекты — если нужна модификация

Пример неизменяемого класса с коллекциями

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, особенно при работе с многопоточностью.