Dictionary Definition
mutable adj : capable of or tending to change in
form or quality or nature; "a mutable substance"; "the mutable ways
of fortune"; "mutable weather patterns"; "a mutable foreign policy"
[syn: changeable]
[ant: immutable]
User Contributed Dictionary
English
Adjective
- Changeable; inclined to mutate.
Translations
- German: mutabel, veränderlich
- Romanian: muabil
Extensive Definition
In
object-oriented and functional
programming, an immutable object is an object whose state cannot be
modified after it is created. This is in contrast to a mutable
object, which can be modified after it is created. An object can be
either entirely immutable or some attributes in the object may be
declared immutable; for example, using the const
member data attribute in the C++ programming
language. In some cases, an object is considered immutable even if
some internally used attributes change but the object's state
appears to be unchanging from an external point of view. For
example, an object that uses memoization to cache the
results of expensive computations could still be considered an
immutable object. The initial state of an immutable object is
usually set at its inception,
but can also be set before actual use of the object.
Immutable objects are often useful because some
costly operations for copying and comparing can be omitted,
simplifying the program code and speeding execution. However,
making an object immutable is usually inappropriate if the object
contains a large amount of changeable data. Because of this, many
languages allow for both immutable and mutable objects.
Background
In most object-oriented languages, objects can be referred to using references. Some examples of such languages are Java, C++,C#,VB.NET and many scripting languages, such as Python and Ruby. In this case, it matters whether the state of an object can vary when objects are shared via references.If an object is known to be immutable, it can be
copied simply by making a copy of a
reference to it instead of copying the entire object. Because a
reference (typically only the size of a pointer) is usually much smaller
than the object itself, this results in memory savings and a boost
in execution speed.
The reference copying technique is much more
difficult to use for mutable objects, because if any user of a
reference to a mutable object changes it, all other users of that
reference will see the change. If this is not the intended effect,
it can be difficult to notify the other users to have them respond
correctly. In these situations, defensive
copying of the entire object rather than the reference is
usually an easy but costly solution. The observer
pattern is an alternative technique for handling changes to
mutable objects.
Immutable objects can be useful in multi-threaded
applications. Multiple threads can act on data represented by
immutable objects without concern of the data being changed by
other threads. Immutable objects are therefore considered to be
more thread-safe
than mutable objects.
The practice of always using references in place
of copies of equal objects is known as interning.
If interning is used, two objects are considered equal if and only
if their references, typically represented as integers, are equal.
Some languages do this automatically: for example,
Python automatically interns strings. If the algorithm which
implements interning is guaranteed to do so in every case that it
is possible, then comparing objects for equality is reduced to
comparing their pointers, a substantial gain in speed in most
applications. (Even if the algorithm is not guaranteed to be
comprehensive, there still exists the possibility of a fast path case
improvement when the objects are equal and use the same reference.)
Interning is generally only useful for immutable objects.
Implementation
Immutability does not imply that the object as stored in the computer's memory is unwriteable. Rather, immutability is a compile-time construct that indicates what a programmer should do, not necessarily what s/he can do (for instance, by circumventing the type system or violating const correctness in C or C++).A classic example of an immutable object is an
instance of the Java String class.
String s = "ABC"; s.toLowerCase();
The method toLowerCase() will not change the data
"ABC" that s contains. Instead, a new String object is instantiated
and given the data "abc" during its construction. A reference to
this String object is returned by the toLowerCase() method. To make
the String s contain the data "abc", a different approach is
needed.
s = s.toLowerCase();
Now the String s references a new String object
that contains "abc". The String class's methods never affect the
data that a String object contains.
For an object to be immutable, there has to be no
way to change fields, mutable or not, and to access fields that are
mutable. Here is an example of a mutable object written in the
Java programming language.
class Cart
An instance of this class is not immutable: one
can add or remove items either by obtaining the field items by
calling getItems() or by retaining a reference to the List object
passed when an object of this class is created. The following
change partially solves this problem. In the ImmutableCart class,
the list is immutable: you cannot add or remove items. However,
there is no guarantee that the items are also immutable. One
solution is to use the decorator
pattern as a wrapper
around each of the list's items to make them also immutable.
class ImmutableCart
In C++, a const-correct implementation of Cart
would allow the user to declare new instances of the class as
either const (immutable) or mutable, as desired, by providing two
different versions of the getItems() method. (Notice that in C++ it
is not necessary — and in fact impossible — to
provide a specialized constructor for const instances.)
template class Cart ;
In
Python some built-in types are immutable, but custom classes
are generally mutable. To create an immutable class, one should
override attribute setting and deletion to raise exceptions:
class Immutable(object): """An immutable class
with a single attribute 'value'.""" def __setattr__(self, *args):
raise TypeError("can't modify immutable instance") __delattr__ =
__setattr__ def __init__(self, value): # we can no longer use
self.value = value to store the instance data # so we must
explicitly call the superclass super(Immutable,
self).__setattr__('value', value)
A technique which blends the advantages of
mutable and immutable objects, and is supported directly in almost
all modern hardware, is copy-on-write
(COW). Using this technique, when a user asks the system to copy an
object, it will instead merely create a new reference which still
points to the same object. As soon as a user modifies the object
through a particular reference, the system makes a real copy and
sets the reference to refer to the new copy. The other users are
unaffected, because they still refer to the original object.
Therefore, under COW, all users appear to have a mutable version of
their objects, although in the case that users do not modify their
objects, the space-saving and speed advantages of immutable objects
are preserved. Copy-on-write is popular in virtual
memory systems because it allows them to save memory space
while still correctly handling anything an application program
might do.
Usage
Strings and other concrete objects are typically expressed as immutable objects to improve readability and runtime efficiency in object-oriented programming. In Python, Java and the .NET Framework, strings are immutable objects. Both Java and the .NET Framework have mutable versions of string. In Java these are StringBuffer and StringBuilder (mutable versions of Java ) and in .NET this is StringBuilder (mutable version of .Net String). Python 3 will have a mutable string (bytes) variant, named buffer.Additionally, all of the primitive
wrapper classes in Java are immutable.
Enforcement of the pattern can be checked by
using specialized compilers (see for example http://pec.dev.java.net/), and there
is a proposal
to add immutable types to Java.
Similar patterns are the Immutable
Interface and Immutable
Wrapper.
In pure functional
programming languages it is not possible to create mutable
objects, so all objects are immutable.
External links
- Article "Java theory and practice: To mutate or not to mutate?" by Brian Goetz
- Java Reference Java Practices: Immutable objects
- Descriptions from Portland Pattern Repository
- Chapter "Immutability of Objects" in the Common Lisp Interface Manager Specification
- Chapter "Immutable Classes" from a Sather manual
This article contains some material from the
Perl Design Patterns Book.
mutable in Japanese: イミュータブル
mutable in Russian: Неизменяемый объект
mutable in Ukrainian: Незмінний
об'єкт
Synonyms, Antonyms and Related Words
able to adapt, adaptable, adjustable, alterable, alterative, ambitendent, ambivalent, at loose ends,
brittle, capricious, changeable, changeful, changing, checkered, choppy, corruptible, deciduous, deviating, deviative, deviatory, different, disorderly, divaricate, divergent, diversified, diversiform, double-minded,
dubious, dying, ephemeral, erose, erratic, evanescent, ever-changing,
fading, fence-sitting,
fence-straddling, fickle,
fleeting, flexible, flitting, fluctuating, fluid, fly-by-night, flying, fragile, frail, fugacious, fugitive, impermanent, impetuous, impulsive, inconsistent, inconstant, indecisive, infirm of
purpose, insubstantial, irregular, irresolute, irresolved, jagged, jerky, kaleidoscopic, lubricious, malleable, many-sided,
mercurial, metamorphic, mobile, modifiable, momentary, mortal, motley, movable, mugwumpian, mugwumpish, nonconformist, nondurable, nonpermanent, nonstandard, nonuniform, of two minds,
passing, perishable, permutable, plastic, pluralistic, protean, proteiform, ragged, resilient, rough, rubbery, shifty, shilly-shally,
short-lived, slippery,
spasmodic, sporadic, subject to death,
supple, swaying, swinging, temperamental, temporal, temporary, ticklish, transient, transitive, transitory, uncertain, undecided, undetermined, undurable, unenduring, unequable, unequal, uneven, unorthodox, unresolved, unsettled, unstable, unsteady, unsystematic, ununiform, vacillating, variable, variegated, variform, various, varying, volatile, wavering