Java Reference
In-Depth Information
It looks as though we could use a mutator method from the class
String
to
change the name referenced by
nameAlias
and so violate the privacy of the
instance variable
name
. Is something wrong? Do we have to rewrite the method
getName
to use the copy constructor for the class
String
? No, everything is fine.
We cannot use a mutator method with
nameAlias
because the class
String
has no
mutator methods! The class
String
contains no methods that change any of the
data in a
String
object.
At first, it may seem as though you can change the data in an object of the class
String
. What about the string processing we have seen, such as the following?
String greeting = "Hello";
greeting = greeting + " friend.";
Have we not changed the data in the
String
object from
"Hello"
to
"Hello
friend."
? No, we have not. The expression
greeting
+
" friend."
does not change
the object
"Hello"
; it creates a new object, so the assignment statement
greeting = greeting + " friend.";
replaces the reference to
"Hello"
with a reference to the different
String
object
"Hello friend."
. The object
"Hello"
is unchanged. To see that this is true, consider
the following code:
String greeting = "Hello";
String helloVariable = greeting;
greeting = greeting + " friend.";
System.out.println(helloVariable);
This produces the output
"Hello"
. If the object
"Hello"
had been changed, the out-
put would have been
"Hello friend."
A class that contains no methods (other than constructors) that change any of
the data in an object of the class is called an
immutable class
, and objects of the
class are called
immutable objects
. The class
String
is an immutable class. It is
perfectly safe to return a reference to an immutable object, because the object
cannot be changed in any undesirable way; in fact, it cannot be changed in any
way whatsoever.
A class that contains public mutator methods or other public methods, such as
input methods, that can change the data in an object of the class is called a
mutable
class
, and objects of the class are called
mutable objects
. The class
Date
is an example
of a mutable class; many, perhaps most, of the classes you define will be mutable
classes. As we noted in the subsection entitled “Privacy Leaks” (but using other
words): You should never write a method that returns a mutable object, but should
instead use a copy constructor (or other means) to return a reference to a completely
independent copy of the mutable object.
immutable
mutable