DEV Community

Emanoel Carvalho
Emanoel Carvalho

Posted on

Objetos Mutáveis e Imutáveis em Java

Em Java, a mutabilidade de um objeto está relacionada à capacidade de alterar o seu estado (valores dos atributos) após a sua criação. Objetos mutáveis podem ter seus estados alterados ao longo do tempo, enquanto objetos imutáveis têm um estado fixo que não pode ser alterado depois que o objeto é criado.

1. Objetos Mutáveis

Objetos mutáveis são aqueles cujo estado (valores dos atributos) pode ser modificado após sua criação. Isso significa que, depois de criar um objeto mutável, você pode modificar seus atributos diretamente, ou por meio de métodos, se a classe permitir.

Exemplo de Objeto Mutável:

class Carro {
    // Atributos mutáveis
    String modelo;
    String cor;
    int ano;
    double velocidadeAtual;

    // Construtor para inicializar o objeto
    Carro(String modelo, String cor, int ano) {
        this.modelo = modelo;
        this.cor = cor;
        this.ano = ano;
        this.velocidadeAtual = 0; // Inicializando a velocidade
    }

    // Método para acelerar
    void acelerar() {
        velocidadeAtual += 10;
        System.out.println("Acelerando... Velocidade atual: " + velocidadeAtual + " km/h");
    }

    // Método para mudar a cor
    void mudarCor(String novaCor) {
        cor = novaCor;
        System.out.println("A nova cor do carro é: " + cor);
    }
}

public class TesteCarroMutavel {
    public static void main(String[] args) {
        // Criando um objeto mutável
        Carro carro = new Carro("Fusca", "Azul", 1980);

        // Exibindo estado inicial
        System.out.println("Cor inicial do carro: " + carro.cor);

        // Alterando o estado do objeto
        carro.acelerar();
        carro.mudarCor("Vermelho");  // Mudando o estado (atributo) do objeto
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação:

  • Objeto Mutável: O objeto carro é mutável porque seus atributos, como cor e velocidadeAtual, podem ser alterados depois de sua criação. O método mudarCor permite alterar o valor do atributo cor, e o método acelerar modifica o atributo velocidadeAtual.
  • Alterações no Estado: O estado do objeto pode ser modificado diretamente após a criação, refletindo o comportamento mutável.

2. Objetos Imutáveis

Objetos imutáveis são aqueles cujo estado não pode ser alterado depois de sua criação. Uma vez que os valores dos atributos são definidos, não é possível modificá-los diretamente ou por meio de métodos. Objetos imutáveis são frequentemente usados para garantir a segurança e a integridade dos dados, já que o estado do objeto não pode ser alterado de forma inesperada.

Exemplo de Objeto Imutável:

final class CarroImutavel {
    // Atributos imutáveis
    private final String modelo;
    private final String cor;
    private final int ano;

    // Construtor para inicializar o objeto
    CarroImutavel(String modelo, String cor, int ano) {
        this.modelo = modelo;
        this.cor = cor;
        this.ano = ano;
    }

    // Métodos getters para acessar os valores (sem setters)
    public String getModelo() {
        return modelo;
    }

    public String getCor() {
        return cor;
    }

    public int getAno() {
        return ano;
    }
}

public class TesteCarroImutavel {
    public static void main(String[] args) {
        // Criando um objeto imutável
        CarroImutavel carro = new CarroImutavel("Fusca", "Azul", 1980);

        // Exibindo os valores dos atributos
        System.out.println("Modelo do carro: " + carro.getModelo());
        System.out.println("Cor do carro: " + carro.getCor());
        System.out.println("Ano do carro: " + carro.getAno());

        // Não podemos alterar os atributos diretamente
        // carro.cor = "Vermelho";  // Erro: atributo final
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação:

  • Objeto Imutável: O objeto carro é imutável porque seus atributos são declarados como final e não há métodos que permitem modificá-los após a criação do objeto. Uma vez que o objeto é construído, seus valores são fixos.
  • Segurança e Integridade: O uso de atributos final e a ausência de métodos modificadores (setters) garantem que o estado do objeto não seja alterado. Isso é especialmente útil quando você precisa de segurança em relação ao estado de objetos compartilhados em sistemas concorrentes ou quando deseja garantir que certos dados não sejam modificados.

3. Diferenças Entre Objetos Mutáveis e Imutáveis

Objetos Mutáveis

  • Estado: O estado do objeto pode ser alterado após a criação.
  • Uso: Útil quando você precisa modificar o estado de um objeto ao longo do tempo, como em uma conta bancária ou em um jogo, onde o estado de um objeto (como a posição de um jogador ou o saldo de uma conta) muda frequentemente.
  • Exemplo: A classe Carro do exemplo acima é mutável, já que podemos mudar a cor e a velocidade do carro após a criação.

Objetos Imutáveis

  • Estado: O estado do objeto não pode ser alterado depois de sua criação.
  • Uso: Útil quando você deseja garantir que o estado do objeto seja seguro, consistente e não seja alterado acidentalmente. Isso é importante, por exemplo, em sistemas financeiros ou em dados compartilhados entre múltiplas threads.
  • Exemplo: A classe CarroImutavel no exemplo acima é imutável, já que não podemos modificar o modelo, a cor ou o ano do carro após sua criação.

4. Vantagens de Usar Objetos Imutáveis

  • Segurança: Objetos imutáveis são naturalmente mais seguros, pois seu estado não pode ser alterado por outras partes do programa.
  • Concorrência: Eles são mais seguros em sistemas multithreaded, já que não há risco de mudanças inesperadas no estado do objeto por diferentes threads ao mesmo tempo.
  • Previsibilidade: Como o estado do objeto não muda, você pode ter uma maior certeza sobre os valores que o objeto possui, o que torna o comportamento mais previsível.

Exemplo de Classe Imutável Usando a Classe String:

A classe String em Java é um exemplo clássico de objeto imutável. Depois de uma String ser criada, seu valor não pode ser alterado.

public class ExemploString {
    public static void main(String[] args) {
        String texto = "Olá";
        System.out.println("Texto original: " + texto);

        // Tentando modificar o texto (não é possível)
        texto = texto.concat(", Mundo!"); // Cria um novo objeto String
        System.out.println("Texto modificado: " + texto); // A string original "Olá" não foi modificada
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação:

  • A classe String é imutável em Java. No exemplo acima, quando tentamos adicionar ", Mundo!" ao texto original, o método concat cria uma nova string com o valor concatenado, mas o objeto original texto não é alterado.

Conclusão

  • Objetos Mutáveis: São objetos cujo estado pode ser alterado após sua criação. Eles são úteis em situações em que o estado de um objeto precisa mudar ao longo do tempo, mas podem ser propensos a erros em sistemas complexos, especialmente quando o estado pode ser alterado de forma inesperada.
  • Objetos Imutáveis: São objetos cujo estado é definido uma vez no momento da criação e não pode ser alterado. Eles são úteis para garantir segurança, consistência e previsibilidade, especialmente em ambientes concorrentes ou quando a integridade dos dados precisa ser protegida.
  • O uso de objetos imutáveis pode aumentar a segurança e reduzir a complexidade do código, enquanto objetos mutáveis oferecem maior flexibilidade quando as mudanças de estado são necessárias.

    Compreender quando usar objetos mutáveis ou imutáveis é uma habilidade importante para criar sistemas mais seguros e eficientes.

Top comments (0)