Това, че позоваването на списъка е неизменно, не означава, че списъкът, за който се отнася, е неизменен.
Дори ако 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 data structure | List data structure
.-------------------------+------------------------------------.
Immutable | String | Collection.unmodifiableList(...) |
-----------+-------------------------+------------------------------------|
Mutable | StringBuffer | ArrayList |
'-------------------------+------------------------------------'
person
aioobe
schedule
26.05.2011