Что отличает объекты, объявленные как Unmodifiable, от полностью Immutable объектов в контексте Java?
Answer from AI
sobes.tech AI
В Java объекты, объявленные как Unmodifiable, и полностью Immutable объекты отличаются по уровню гарантии неизменности:
-
Unmodifiable объекты — это объекты, которые не позволяют изменять своё состояние через предоставленный интерфейс, например, через методы коллекций из
Collections.unmodifiableList(). Однако, если исходный объект изменяется напрямую, то изменения будут видны и в "неизменяемом" представлении. То есть неизменность поверхностная и зависит от того, что никто не изменяет исходные данные. -
Immutable объекты — это объекты, состояние которых не может измениться после создания. Все поля обычно
final, отсутствуют сеттеры, и внутренние структуры тоже неизменяемы. Такие объекты гарантируют полную неизменность, что повышает безопасность и упрощает многопоточность.
Пример Unmodifiable:
List<String> list = new ArrayList<>();
list.add("a");
List<String> unmodList = Collections.unmodifiableList(list);
list.add("b"); // unmodList тоже увидит "b"
Пример Immutable:
public final class ImmutablePoint {
private final int x;
private final int y;
public ImmutablePoint(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
}
Таким образом, immutable объекты обеспечивают более строгую и глубокую неизменность по сравнению с unmodifiable.