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 Personcom um membro fatherreferenciando outro Personobjeto. 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.