In most OOP languages, objects are generally mutable with a limited set of exceptions (like e.g. tuples and strings in python). In most functional languages, data is immutable.
Both mutable and immutable objects bring a whole list of advantages and disadvantages of their own.
There are languages that try to marry both concepts like e.g. scala where you have (explicitly declared) mutable and immutable data (please correct me if I am wrong, my knowledge of scala is more than limited).
My question is: Does complete (sic!) immutability -i.e. no object can mutate once it has been created- make any sense in an OOP context?
Are there designs or implementations of such a model?
Basically, are (complete) immutability and OOP opposites or orthogonal?
Motivation: In OOP you normally operate on data, changing (mutating) the underlying information, keeping references between those objects. E.g. an object of class Person
with a member father
referencing another Person
object. If you change the name of the father, this is immediately visible to the child object with no need for update. Being immutable you would need to construct new objects for both father and child. But you would have a lot less kerfuffle with shared objects, multi-threading, GIL, etc.