Объекты каких классов являются иммутабельными

Ответ

Иммутабельными в Java являются объекты классов, состояние которых нельзя изменить после создания. Примеры:

  • String — после создания строку нельзя изменить (методы типа substring() возвращают новую строку)
  • Классы-обёртки (Integer, Double, Boolean и т.д.)
  • LocalDate, LocalTime, ZonedDateTime из пакета java.time
  • BigInteger, BigDecimal
  • Коллекции из Collections.unmodifiableXXX()

Пример иммутабельного класса:

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // Только геттеры, нет сеттеров
}

Ответ 18+ 🔞

А, ну ты про эти штуки, которые как гранитный хуй — создал и нихуя не сдвинешь! Иммутабельные, блядь, объекты в Java. Это такие, которые после своего рождения стоят как вкопанные, и хоть ты тресни, их состояние не поменяешь.

Вот смотри, классический пример — это наш всеми любимый String. Ты думаешь, substring() или toUpperCase() меняют строку? Да хуй там плавал! Они просто выдают тебе новую, свежую строку, а старая так и лежит в памяти, как святой дух, неприкосновенная. Пытаться её изменить — это как пытаться перекрасить стену взглядом, ёпта.

Дальше идут эти, как их... классы-обёртки. Integer, Double — все эти ребята. Создал ты циферку 42, и всё, пиздец. Она теперь вечность будет 42, хоть в жопу себе впендюрь. Или даты из java.timeLocalDate. Поставил на календаре "завтра", так оно и останется "завтра", даже если ты уже проебал все дедлайны.

А ещё есть BigInteger и BigDecimal. Ну, для тех, у кого цифры такие огромные, что овердохуища. И их тоже не сломаешь.

И коллекции! Если завернёшь свою List в Collections.unmodifiableList(), то получишь, по сути, музейный экспонат. Смотреть можно, а трогать — хуй тебе, а не изменение. Попробуй добавить элемент — получишь исключение, как по ебалу.

Вот, смотри, как самому такого монстра слепить. Класс ImmutablePoint:

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // Только геттеры, нет сеттеров
}

Видишь? Класс final — чтобы никто, сука, не унаследовался и не накостылял. Поля final — прикипели намертво, как говно к ворсу. И только геттеры! Никаких сеттеров, блядь! Создал точку с координатами (5, 10) и сиди теперь с ней до скончания времён. Хочешь точку в другом месте? Создавай новый объект, хитрая жопа! Вот и вся философия.