Почему целые числа неизменны в Java?

Я знаю, что целые числа неизменны в Java. Но почему он разработан таким образом?

Я прочитал другие ответы, прежде чем задавать этот вопрос:

Является ли Integer неизменным

я ++ все еще работает для неизменяемого Integer в Java?

Почему классы оболочки Java неизменяемы?

Но я не мог найти вариант использования, который обязывает Integer быть неизменным. Существуют ли какие-либо технические причины, например, для String?

  • Строка используется как параметр в сетевом соединении, URL-адрес базы данных и т.д. Его можно легко скомпрометировать, если он изменен.
  • Для поддержки средства StringPool.
  • Для поддержки механизма загрузки классов, в котором строки используются в качестве аргументов. Строка, изменяемая, приводит к загрузке неправильного класса.

Я понимаю, что есть обертки, такие как AtomicInteger для mutable.

UPDATE:

Из беседы нет универсальной причины, которая могла бы гарантировать, что Целые являются неизменными. Однако, делая неизменным, он дает некоторый бонус, как указано в ответах.

Такая цитата из Andrey

возможность кэширования.

Другие сокращают глобальное состояние

проще многопоточность

Ответ 1

Вы не найдете обязательной причины, по которой обертки java.lang должны быть неизменными. Просто потому, что это дизайнерское решение. Они могли бы решить иначе. Разработчикам языка пришлось выбирать между изменчивыми и неизменными. И они выбрали неизменный. Что это.

Существуют некоторые убедительные (IMO) причины, хотя они делают их неизменными:

Это согласуется с String. Те же аргументы, которые вы указали для String как неизменяемые, относятся также к Integer и т.д. (Например, подумайте о номере порта в карте свойств). Это обычно относится к любому изменяемому типу.

Неизменяемые типы исключают множество трудностей, чтобы найти ошибки, которые можно сделать там, где один невольно изменил значение члена объекта, изменив значение, полученное с помощью геттера. Это сохраняет много оборонительного копирования, когда тип является неизменным. Самый печально известный пример - java.util.Date, что обычно больно использовать, потому что оно изменено (проблемы API отсутствуют).

Также неизменяемые типы позволяют использовать общие экземпляры, например, например. Integer для общеупотребительных значений (см. Integer.valueOf(int)).

Ответ 2

Может ли личность значения 1 когда-либо изменяться? Может ли он стать 2? Нет. Поэтому почему Integer и другие числовые типы неизменяемы. Они предназначены для моделирования идентичности.

Ответ 3

Чтобы ссылка на объект инкапсулировала значение, находящееся под контролем вещи, которая его удерживает, должно применяться одно из трех условий:

  • Класс объекта должен быть неизменным.

  • Ссылка должна идентифицировать экземпляр, который никогда не будет подвергаться действиям, которые могут его мутировать.

  • Ссылка никогда не должна делиться с каким-либо объектом, который не находится под контролем его владельца, независимо от того, будет ли это изменяться.

Код, который содержит ссылки типа Integer, обычно делает это с целью инкапсуляции целочисленных значений. Создание Integer immutable позволяет классам свободно обмениваться ссылками, которые используются для инкапсуляции значения. Хотя бывают случаи, когда класс MutableInteger сам по себе был бы полезен [такая вещь, возможно, была бы немного чище, чем одноэлементная int[] и более эффективная, чем AtomicInteger], нельзя было бы пройти MutableInteger класс к методу как средство прохождения числа в нем; вместо этого следует передать его с целью предоставления этому методу места для хранения числа.

Ответ 4

Integer литерал (2, 3) также является неизменным, например. int var=3; Это переменная int (var слева имеет сторону), которая изменена. Цель Integer - это "объект как значение" (справа), а не "объект как переменная" (слева). Поскольку Java использует ссылки, изменчивость может быть как в ссылке, так и в содержимом объекта. Ссылка на объект (переменная r в Integer r=2;) может быть переменной частью. В результате изменчивость обеспечивается с помощью ссылки на переменную, а не будет использовать постоянную ссылку (константу r) и переменное содержимое упомянутого объекта. Они могли бы использовать имя класса Integer в качестве переменной, но тогда для неизменяемого (правое значение стороны) было бы необходимо другое имя класса. Поэтому MutableInteger и ImmutableInteger используются в программах в некоторых точках. Однако люди чаще используют последний. Итак, на раннем этапе разработчики Java решили использовать более короткое имя Integer для последнего (ImmutableInteger). Существуют различные причины, по которым последнее оказывается более полезным, что объясняется в других ответах на этот пост. Оба варианта возможны, и оба они существуют, и спрос на них больше.