2
respostas

Dúvida sobre imutabilidade

A imutabilidade de um objeto String só é real se usamos o método de uma string nela mesmo, podendo ser mútavel se for uma atribuição a ela mesma, correto? Exemplo de código abaixo:

package br.com.bytebank.teste;

public class TesteString2 {

public static void main(String[] args) {
    String nome = "ALURA";
    System.out.println("teste 1: "+nome);
    nome.replace("AL", "bl"); //imutavel por executar o metodo nela mesma
    System.out.println("teste 2: "+nome);
    nome = nome.replace("AL", "bl"); //mutavel desde que a mesma variavel receba o resultado dela altarada
    System.out.println("teste 3: "+nome);
}

}


Resultado: teste 1: ALURA teste 2: ALURA teste 3: blURA

2 respostas

Oi Ademir, tudo bom?

Toda String sempre é imutável. Quando você atribui novamente, o que está rolando por baixo dos panos é justamente a criação de uma nova String que é retornada.

public static void main(String[] args) {
    String nome = "ALURA";
    System.out.println("teste 1: "+nome);
    nome.replace("AL", "bl"); //aqui foi criada uma nova string e devolvida, a gente só n guardou em nenhum lugar
    System.out.println("teste 2: "+nome);
    nome = nome.replace("AL", "bl"); // aqui foi criada uma nova string e guardamos dentro da variavel nome. A antiga referência que existia dentro dessa variavel será limpada pelo garbage colector
    System.out.println("teste 3: "+nome);
}

Abraço!

... "podendo ser mútavel se for uma atribuição a ela mesma," ...

Uma atribuição não está mudando a String(imutável). Como a expressão diz, está "atribuindo" (adicionando ou mudando(por completo*)) o valor à uma variável/objeto.

É por esta mesma lógica, que:

nome = nome + " Sobrenome"; 
// "nome" RECEBE "nome" mais "sobrenome" 

Também não é uma mudança na String.

:-)