Подтвердить что ты не робот

Являются ли все примитивные классы-оболочки неизменяемыми объектами?

Являются ли все примитивные классы-оболочки в Java неизменяемыми объектами? Строка неизменна. Какие еще неизменные объекты?

4b9b3361

Ответ 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

Ответ 4

Один нечетный класс "обертка" Void, который не имеет никаких действительных объектов, неизменяемых или других. Его можно установить только в null.

Одно использование для Void заключается в том, чтобы отмечать общие типы возвращаемых значений без значения. (Вы не можете использовать примитивные типы или Void)

например.

Callable<Void> callable = new Callable<Void>() {
    public Void call() {
         // do something
        return null;
    }
};

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