Являются ли все примитивные классы-оболочки в Java неизменяемыми объектами? Строка неизменна. Какие еще неизменные объекты?
Являются ли все примитивные классы-оболочки неизменяемыми объектами?
Ответ 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
Ответ 2
До Java 5 все примитивные классы-оболочки были неизменными.
Однако класс атомных оболочек, введенный в Java 5 (AtomicInteger
, AtomicLong
, AtomicBoolean
и AtomicReference<V>
), является изменяемым.
Ответ 3
Да, конечно. Классы обертки неизменны.
Вы можете прочитать Почему классы-оболочки неизменяемы в java?, чтобы понять неизменность классы-оболочки.
Ответ 4
Один нечетный класс "обертка" Void
, который не имеет никаких действительных объектов, неизменяемых или других. Его можно установить только в null.
Одно использование для Void
заключается в том, чтобы отмечать общие типы возвращаемых значений без значения. (Вы не можете использовать примитивные типы или Void
)
например.
Callable<Void> callable = new Callable<Void>() {
public Void call() {
// do something
return null;
}
};
Даже если Date
является технически изменчивым, я бы назвал его "неизменным по конвентности". Обычно понимается или предполагается, что вы не измените объект Date, но замените его, чтобы изменить его, как любой другой неизменяемый объект.