Назад Зміст Вперед

10.1. Strings – властивість immutable

String незмінний клас в Java. Вся інформація в екземплярі ініціалізації при створенні екземпляра не може бути змінена.

Для початку, є різниця між  immutable-об'єктом (тобто, незмінним), і final-посиланням.
Ключове слово final для об'єктних типів гарантує незмінність лише посилання, але не самого об'єкта. Наприклад, якщо у вас є остаточного посилання на ArrayList <T>, ви тим не менш можете додавати в нього нові елементи або змінювати існуючі.

У разі ж  immutable-об'єкта об'єкт після закінчення конструктора не змінюється взагалі. Одного лише модифікатора остаточно для цього недостатньо, необхідно, щоб всі об'єкти були теж незмінними. 

Іmmutable-об'єкти не вимагають синхронізації при багатопотоковому доступі. Ось власне і вся рекомендація: використовуйте незмінні об'єкти, і вам не доведеться думати про те, що потрібно, а що не потрібно синхронізувати. 

Immutable об'єкт - це об'єкт, стан якого після створення неможливо змінити. У разі Java це значить що всі поля екземпляра у клас відзначені як final і є примітивами або теж immutable типами.

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

    public ImmutablePoint(int x, int y, String description) {
        this.x = x;
        this.y = y;
        this.description = description;
    }
}

Після створення екземпляра Immutable Point його модифікація неможлива. 
Найпростіший приклад immutable класу з JDK це String. Будь-які методи, які ви викличте в рядку (наприклад description.toLowerCase ()) повернуть новий рядок, а не модифікують вихідний.

У разі багатопотокового програмування переваги immutable класів очевидні: після створення об'єкти можна передавати іншим потокам і вони завжди будуть в актуальному стані.

Діаграма, щоб показати Java Рядок Immutability

Ось набір діаграм для ілюстрації Java String's immutability.

1. Оголосити рядок
String s = "abcd";
s зберігає посилання string object. Стрілку нижче слід інтерпретувати як "магазин ведення".


2. Призначити один рядок змінної іншої змінної рядка String s2 = s;
s2 зберігає те ж значення, що й об'єкт String.

3. Рядок Concats = s.concat("ef");
s = s.concat("ef"); s зберігає посилання на новостворений об'єкт String.


Після того, як рядок створюється в пам'яті (купі), він не може бути змінений. Слід зазначити, що всі методи String, не змінюють сам String, а повертають новий рядок.

Якщо потрібен рядок, який можна буде змінити, то потрібно використати StringBuffer або StringBuilder.

.