Java Reference
In-Depth Information
PITFALL:
(continued)
Because
dateName
contains the same reference as the private instance variable
born
of
the object
personObject
, changing the year part of
dateName
changes the year part of
the private instance variable
born
of
personObject
. Not only does this bypass the
consistency checks in the mutator method
setBirthDate
, but it also is a likely source
of an inadvertent change to the
born
instance variable.
If we define
setBirthDate
as we did in Display 5.19 and as shown below, this
problem does not happen. (If you do not see this, go through the code step by step
and trace what happens.)
public void
setBirthDate(Date newDate)
{
if
(consistent(newDate, died))
born =
new
Date(newDate);
. . .
One final word of warning: Using copy constructors as we have been doing is not the
officially sanctioned way to make copies of an object in Java. The officially sanc-
tioned way to create copies of an object is to define a method named
clone
. We will
discuss
clone
methods in Chapters 8 and 13. In Chapter 8 we show you that, in
some situations, there are advantages to using a
clone
method instead of a copy con-
structor. In Chapter 13 we describe the officially sanctioned way to define the
clone
method. For what we will be doing until then, a copy constructor will be a very ade-
quate way of creating copies of an object.
clone
■
Self-Test Exercises
38. What is a copy constructor?
39. What output is produced by the following code?
Date date1 =
new
Date("January", 1, 2006);
Date date2;
date2 = date1;
date2.setDate("July", 4, 1776);
System.out.println(date1);
What output is produced by the following code? Only the third line is different
from the previous case.
Date date1 =
new
Date("January", 1, 2006);
Date date2;
date2 =
new
Date(date1);
date2.setDate("July", 4, 1776);
System.out.println(date1);