Todas as classs de invólucros primitivos são objects imutáveis?

Todas as classs de wrapper primitivas em objects imutáveis ​​de Java? String é imutável. Quais são os outros objects imutáveis?

Qualquer tipo que não lhe dê nenhum meio de alterar os dados dentro dele é imutável – é tão simples quanto isso. Sim, todos os tipos primitivos de wrapper são imutáveis 1 , assim como String . UUID , URL e URI são outros exemplos.

Embora Calendar e Date na API Java interna sejam mutáveis, muitos dos tipos dentro do Joda Time são imutáveis ​​- e, em minha opinião, essa é uma razão pela qual o Joda Time é mais fácil de se trabalhar. Se um object é imutável, você pode manter uma referência a ele em algum outro lugar do seu código e não precisa se preocupar se alguma outra parte do código vai ou não fazer alterações – é mais fácil raciocinar sobre o seu código.


1 pelo qual quero dizer java.lang.Integer etc. Como já foi observado em outros lugares, as classs Atomic* são mutáveis ​​e, na verdade, devem ser usadas para servir ao seu propósito. Há uma diferença em minha mente entre “o conjunto padrão de classs de invólucros primitivos” e “o conjunto de classs que envolvem valores primitivos”.

Você pode escrever sua própria class de wrapper mutável com muita facilidade:

 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; } } 

Então, como você pode ver, não há nada intrinsecamente imutável sobre as classs wrapper – é apenas que os padrões foram projetados para serem imutáveis, em virtude de não fornecer qualquer maneira de alterar o valor empacotado.

Note que isto permite que o mesmo object seja usado repetidamente quando o boxe, para valores comuns:

 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 

Antes do Java 5, todas as classs de invólucros primitivos eram imutáveis.

No entanto, as classs do wrapper atômico introduzidas no Java 5 ( AtomicInteger , AtomicLong , AtomicBoolean e AtomicReference ) são mutáveis.

Sim, claro. As classs de invólucro são imutáveis.

Você pode ler Por que classs wrapper são imutáveis ​​em java? para entender a imutabilidade das classs wrapper.

Uma class “wrapper” ímpar é o Void que não possui nenhum object válido, imutável ou não. Só pode ser definido como nulo.

Um uso para o Void é marcar tipos de retorno genéricos sem valor. (Você não pode usar tipos primitivos ou void )

por exemplo

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

Mesmo que Date seja tecnicamente mutável, eu o descreveria como “imutável por convenção”. É geralmente entendido ou assumido que você não mudaria um object Date, mas o replaceia para alterá-lo como qualquer outro object imutável.

Intereting Posts