Действительно ли классы Java-оболочки являются неизменяемыми? - PullRequest
20 голосов
/ 07 ноября 2010

Классы Java Wrapper должны быть неизменными.Это означает, что после создания объекта, например,

Integer i = new Integer(5);

, его значение нельзя изменить.Тем не менее, выполнение

i = 6;

совершенно правильно.

Итак, что означает неизменность в этом контексте?Связано ли это с автобоксом / распаковкой?Если да, то есть ли какой-нибудь способ помешать компилятору это сделать?

Ответы [ 5 ]

27 голосов
/ 07 ноября 2010

i является ссылкой.Ваш код меняет ссылку i, чтобы указывать на другую, одинаково неизменную, Integer.

final Integer i = Integer.valueOf(5);

может быть более полезным.

18 голосов
/ 07 ноября 2010

Неизменяемый означает, что состояние объекта не может быть изменено. В вашем случае вы не изменили объект new Integer(5), но изменили ссылку i, чтобы указать на другой объект. Надеюсь, это понятно:)

13 голосов
/ 07 ноября 2010

Компилятор автоматически устанавливает значения примитивов, это означает, что

Integer value = 6;

будет скомпилировано как

Integer value = Integer.valueOf(6);

Integer.valueOf вернет экземпляр Integer с заданным значением.В вашем случае i теперь будет ссылаться на Integer (6) вместо Integer (5), сам объект Integer (5) не изменится.

Чтобы увидеть это, вы можете сделать следующее:

Integer i = new Integer(5);//assign new integer to i
Integer b = i;//b refences same integer as i
i = 6;//modify i
System.out.println(i +"!="+b);

Это выведет 6!=5, если целочисленный экземпляр был изменен, вместо него будет напечатано 6!=6.

Чтобы прояснить это, нужно только показать, как присвоение Integer только изменяет ссылку и не изменяет сам экземпляр Integer.Как указывает пользователь @KNU, он не доказывает и не показывает неизменность Integer, насколько я могу судить, неизменность дается только косвенно из-за отсутствия методов модификации в его API и требования, предъявляемого к экземплярам, ​​возвращаемым Integer.valueOf.кэшироваться для определенного диапазона.

5 голосов
/ 07 ноября 2010

Причина, по которой работает i = 6, заключается в том, что автобокс перехватывает и превращает его в i = new Integer(6).Таким образом, как сказал @Peter, вы теперь указываете на новый объект.

0 голосов
/ 25 марта 2013

Все классы-обёртки в java являются неизменяемыми. Мы не можем изменить значение объекта класса-оболочки после того, как он создан, то есть не можем изменить значение, заключенное в объект. Поскольку классы-обертки используются в качестве объектной формы примитивных типов данных и, если они изменчивы, несоответствия данных будут возникать во время выполнения. Однако вы можете изменить ссылочную переменную класса-оболочки для хранения другого объекта.

...