Na maioria das linguagens OOP, os objetos geralmente são mutáveis com um conjunto limitado de exceções (como, por exemplo, tuplas e seqüências de caracteres em python). Na maioria das linguagens funcionais, os dados são imutáveis.
Objetos mutáveis e imutáveis trazem uma lista completa de vantagens e desvantagens.
Existem linguagens que tentam se casar com ambos os conceitos, como por exemplo, scala, em que você (declarado explicitamente) dados mutáveis e imutáveis (por favor, corrija-me se estiver errado, meu conhecimento de scala é mais do que limitado).
Minha pergunta é: A imutabilidade completa (sic!) - que nenhum objeto pode sofrer mutação depois de criada - faz algum sentido em um contexto de POO?
Existem projetos ou implementações desse modelo?
Basicamente, a imutabilidade (completa) e os OOP são opostos ou ortogonais?
Motivação: no OOP, você normalmente opera com dados, alterando (mutando) as informações subjacentes, mantendo referências entre esses objetos. Por exemplo, um objeto de classe Person
com um membro father
referenciando outro Person
objeto. Se você alterar o nome do pai, isso ficará imediatamente visível para o objeto filho, sem necessidade de atualização. Sendo imutável, você precisaria construir novos objetos para pai e filho. Mas você teria muito menos confusão com objetos compartilhados, multi-threading, GIL, etc.