Все ли примитивные классы-обертки являются неизменяемыми объектами? - PullRequest
21 голосов
/ 29 мая 2011

Все ли примитивные классы-обертки в неизменных объектах Java? Строка неизменна. Какие другие неизменные объекты?

Ответы [ 4 ]

22 голосов
/ 29 мая 2011

Любой тип, который не дает никаких средств для изменения данных в нем, является неизменным - это так просто. Да, все типы примитивных оболочек неизменны 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
11 голосов
/ 29 мая 2011

До Java 5 все классы-примитивы были неизменными.

Однако классы атомарных оболочек , представленные в Java 5 (AtomicInteger, AtomicLong, AtomicBoolean и AtomicReference<V>), являются изменяемыми.

3 голосов
/ 25 марта 2013

Да, конечно. Классы обертки неизменны.

Вы можете прочитать Почему классы-оболочки являются неизменяемыми в Java? , чтобы понять неизменность классов-оболочек.

0 голосов
/ 29 мая 2011

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

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

например,

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

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

...