Ответ 1
Любой тип, который не дает вам никаких средств для изменения данных внутри него, неизменен - он так же прост. Да, все примитивные типы обертки неизменяемы 1 как и String
. UUID, URL и URI
- другие примеры.
Хотя Calendar
и Date
во встроенном Java API изменяемы, многие типы внутри Joda Time неизменяемы - и, на мой взгляд, это одна из причин, по которой 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