Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Imutabilidade Objeto

Olá, primeiramente queria parabeniza-los pela aula. Didática execelente.

Gostaria de saber sobre o conceito de imutabilidade de um objeto, pois não compreendi a imutabilidade de uma String direito. Se pensarmos em uma classe qualquer, podemos faze-la da seguinte forma:

public class ClasseNormal {

    public void faleAlgo(){
        System.out.println("Objetos são imutáveis!");
    }

}

ClasseNormal novaClasse = new ClasseNormal();

Neste objeto do tipo Classe normal, o que necessariamente é imutável? Os atributos, métodos? porque a qualquer momento posso mudar essas informações nele contido.

A mesma dúvida eu tenho com a classe String, vamos instaciar a seguinte objeto do tipo String:

String curso = "Alura";

Neste caso, não podemos mudar o nome da variável de referência 'curso', 'Alura' não é o nome da variável de referência do tipo String, por que então eu não posso fazer curso = "Java"?

Obrigado.

2 respostas
solução!

Olá, boa tarde! Tudo bem? No caso das strings, elas são imutáveis no sentido de que seu valor não pode ser alterado, somente reinstanciado:

String curso = "Alura";
curso = "Java";
System.out.println(curso); // Java
curso.toLowerCase();
System.out.println(curso); // Java

Na primeira linha, a variável curso foi instanciada como um objeto do tipo String, na linha seguinte essa variável é instanciada novamente, como se estivesse sendo criada do zero. Portanto nesse caso, o valor do objeto não foi mudado, mas sim o objeto em si, que foi substituído. As strings tem esse comportamento de não serem alteradas pelos seus métodos, como o toLowerCase, que ao invés de alterar a String retorna uma String diferente, para preservar o valor inicial.

public class Palavra {

    private String palavra;

    public Palavra(String palavra) {
        this.palavra = palavra;
    }

    // Somente esse método pode mudar o valor da palavra
    public void alterarPalavra(String novaPalavra) {
        this.palavra = novaPalavra;
    }
}

Usando essa classe de exemplo, a imutabilidade não é um comportamento padrão ou obrigatório, mas sim definido com o modificador private, que faz com que somente os métodos da própria classe possam alterar e/ou acessar seus atributos. Esse comportamento é uma boa prática no mundo Java e no paradigma Orientado a Objetos, porque torna o comportamento do programa mais previsível, já que só os métodos certos da própria classe vão alterar seus atributos. Resumindo, as Strings em Java são imutáveis, mas nem todo objeto vai ser imutável, isso depende dos seus atributos serem públicos ou privados, assim como da ação de seus métodos que podem ou não alterar seus atributos. Porém, todas as variáveis em Java podem ser reinstanciadas, assim sendo substituídas por outras, que podem ter outros valores. Espero ter ajudado!

Breno, tudo bem e você?

Ahhh certo, entendi agora!

Muito obrigado Breno. Muito boa explicação..