То, что ссылка на список неизменна, не означает, что список , к которому она относится , является неизменным.
Даже если list
было сделано final
, это было бы разрешено
// changing the object which list refers to
example.getList().add("stuff");
но это не разрешено:
// changing list
example.list = new ArrayList<String>(); // assuming list is public
Чтобы сделать список неизменным (исключите также первую строку), я предлагаю вам использовать Collections.unmodifiableList
:
public class Example {
final private ArrayList<String> list;
Example(ArrayList<String> listArg) {
list = Collections.unmodifiableList(listArg);
}
}
(Обратите внимание, что это создает неизменяемое представление списка. Если кто-то удерживает исходную ссылку, тогда список все еще можно изменить с помощью этого.)
При использовании String такое поведение невозможно. Так в чем здесь разница?
Это потому, что String
уже неизменен (неизменяем) так же, как список, если бы вы превратили его в неизменяемый список.
Сравнение:
String data structure | List data structure
.-------------------------+------------------------------------.
Immutable | String | Collection.unmodifiableList(...) |
-----------+-------------------------+------------------------------------|
Mutable | StringBuffer | ArrayList |
'-------------------------+------------------------------------'