Любой тип, который не дает никаких средств для изменения данных в нем, является неизменным - это так просто. Да, все типы примитивных оболочек неизменны 1 , как и String
. UUID , URL и URI
и другие примеры.
Хотя Calendar
и Date
во встроенном Java API являются изменяемыми, многие типы в Joda Time являются неизменяемыми - и, на мой взгляд, это one причина, по которой Joda Time легче работать. Если объект является неизменяемым, вы можете хранить ссылку на него где-то еще в своем коде, и вам не нужно беспокоиться о том, собирается ли какой-то другой фрагмент кода вносить изменения - это проще рассуждать о вашем код.
1 , под которым я подразумеваю java.lang.Integer
и т. Д. Как уже отмечалось в другом месте, классы Atomic*
являются изменчивыми, и действительно должны иметь , чтобы служить своей цели. На мой взгляд, существует разница между «стандартным набором классов примитивных оболочек» и «набором классов, которые переносят примитивные значения».
Вы можете очень легко написать свой собственный изменяемый класс-оболочку:
public class MutableInteger
{
private int value;
public MutableInteger(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = value;
}
}
Итак, как вы можете видеть, в классах-обёртках нет ничего неотъемлемого неизменного - просто стандартные были сконструированы для неизменяемыми, так как не предоставили никакого способа изменить обернутое значение.
Обратите внимание, что это позволяет многократно использовать один и тот же объект при упаковке, для общих значений:
Integer x = 100;
Integer y = 100;
// x and y are actually guaranteed to refer to the same object
Integer a = 1000;
Integer b = 1000;
// a and b *could* refer to the same object, but probably won't