Два пункта более или менее говорят об одном и том же.Они просто означают, что после инициализации объекта его не следует менять.
Для того, чтобы объект был действительно неизменным, каждый объект, на который есть ссылки, также не должен быть модифицирован методами доступа.Например, класс String
поддерживается char[]
, который является изменяемым.Тем не менее, класс String
не предоставляет никаких методов, позволяющих вам изменять содержимое его резервного массива.Таким образом, класс String
можно считать неизменным.
Что касается конечных переменных - переменные должны быть в состоянии где-то быть установлены.Было бы бесполезно иметь конечную переменную, которую вы вообще не могли установить.Таким образом, конструктор имеет специальный корпус и позволяет устанавливать переменные, помеченные как окончательные.
class StringArrayList {
// make the variable private, to protect it from being modified from outside the class
private final String[] arr;
StringArrayList(int size) {
// constructors are the only method allowed to set final variables
arr = new String[size];
}
String get(int i) {
// get method doesn't change the state of the object, so is fine
// However, if the object returned is mutable then there might be issues.
return arr[i];
}
void set(int i, String item) {
// set changes the state of arr, and so with this method, StringArrayList cannot
// be considered immutable
arr[i] = item;
}
}