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 класів очевидні: після створення об'єкти можна передавати іншим потокам і вони завжди будуть в актуальному стані.
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.
Діаграма, щоб показати 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.