Objeto imutável

Origem: Wikipédia, a enciclopédia livre.

Em programação orientada a objetos e funcional, um objeto imutável é um objeto no qual seu estado não pode ser modificado após ser criado. Ele é um contraste com um objeto mutável, que pode ser modificado após sua criação. Um objeto pode ser ou inteiramente imutável ou possuir alguns atributos que podem ser declarados como imutáveis; por exemplo, usando o atributo de dado membro const na linguagem de programação C++. Em alguns casos, um objeto é considerado imutável mesmo que alguns atributos internos utilizados mudem mas o estado do objeto aparece como inalterado de um ponto de vista externo. Por exemplo, um objeto que utilize memoização para armazenar os resultados de computações custosas ainda poderia ser considerado como um objeto imutável.

Objetos imutáveis são frequentemente úteis pois algumas operações custosas para cópia e comparação podem ser omitidas, simplificando o código do programa e acelerando a execução. Contudo, tornar um objeto imutável é normalmente não apropriado se o objeto contem uma grande quantidade de dados alteráveis. Devido a isto, muitas linguagens permitem tanto objetos imutáveis e mutáveis.

Plano de fundo[editar | editar código-fonte]

Antes do advento da POO, valores armazenados em variáveis de programa cujo conteúdo nunca era alterado ficaram conhecidas como 'constantes' para diferenciá-las de outras variáveis que poderiam ser alteradas durante a execução. Exemplos incluem a fatores de conversão de quilograma para libras ou o valor de Pi. Na maioria das linguagens orientadas a objetos, os objetos podem ser referenciados por meio de referências. Alguns exemplos de tais linguagens são Java, C++, C# e muitas linguagens de script, tais como Python e Ruby. Neste caso, é importante saber se o estado de um objeto pode variar quando objetos são compartilhados através de referências.

Se um objeto é conhecido por ser imutável, ele pode ser copiado simplesmente fazendo-se uma cópia de uma referência para ele em vez de copiar o objeto inteiro. Devido à referência (normalmente apenas o tamanho de um ponteiro) ser normalmente bem menor que um objeto em si, há economia de memória e um aumento na velocidade de execução.

A técnica de cópia de referência é bem mais difícil de ser utilizada em objetos mutáveis, pois se qualquer usuário de uma referência à um objeto mutável alterá-lo, todos os outros usuários daquela referência enxergarão a mudança. Se este não for o efeito desejado, pode ser difícil notificar os outros usuários para que eles respondam corretamente. Nestas situações, a cópia defensiva do objeto inteiro em vez da referência é normalmente uma solução simples porém mais custosa. O padrão observador é uma técnica alternativa para manipulação de mudanças de objetos mutáveis.

Objetos imutáveis podem ser úteis em aplicações multi-threads. Múltiplas threads podem agir em dados representados por objetos imutáveis sem a preocupação que os dados sejam alterados por outras threads. Objetos imutáveis são portanto considerados mais seguros que objetos mutáveis.

Implementação[editar | editar código-fonte]

Python[editar | editar código-fonte]

Em Python, alguns tipos embutidos (números, booleanos, strings, tuplas, frozensets) são imutáveis, mas classes personalizadas são geralmente mutáveis. Para simular a imutabilidade em uma classe, deve-se substituir a configuração de atributo e a exclusão para geração de exceções:


class Imutavel(objeto):
     """Uma classe imutável com um único 'valor' de atributo."""
     def __setattr__(self, *args):
         raise TypeError("impossível modificar instância imutável")
     __delattr__ = __setattr__
     def __init__(self, valor):
         # não podemos mais usar self.valor = valor para armazenar dados da instância
         # por isso temos de chamar explicitamente a superclasse
         super(Imutavel, self).__setattr__('valor', valor)

C#[editar | editar código-fonte]

No C # você pode forçar a imutabilidade dos campos de uma classe com a instrução readonly. Ao impor todos os campos como imutáveis, você obtém um tipo imutável.

class TipoImutavel
{
    public readonly double _valor;
    public TipoImutavel(double valor) 
    { 
      _valor= valor; 
    }
    public TipoImutavel Square() 
    { 
      return new TipoImutavel(_valor*_valor); 
    }
}

Veja mais[editar | editar código-fonte]

Este artigo é um esboço. Você pode ajudar a Wikipédia expandindo-o. Editor: considere marcar com um esboço mais específico.