Java Reference
In-Depth Information
We want the object created to be an independent copy of
original
. That would
not happen if we had used the following instead:
public
Person(Person original)
//Unsafe
{
if
(original ==
null
)
{
System.out.println("Fatal error.");
System.exit(0);
}
name = original.name;
born = original.born;
//Not good.
died = original.died;
//Not good.
}
Although this alternate definition looks innocent enough and may work fine in many
situations, it does have serious problems.
Assume we had used the unsafe version of the copy constructor instead of the one in
Display 5.19. The “Not good.” code simply copies references from
original.born
and
original.died
to the corresponding arguments of the object being created by the con-
structor. So, the object created is not an independent copy of the
original
object. For
example, consider the code
Person original =
new
Person("Natalie Dressed",
new
Date("April", 1, 1984),
null
);
Person copy =
new
Person(original);
copy.setBirthYear(1800);
System.out.println(original);
The output would be
Natalie Dressed, April 1, 1800-
When we changed the birth year in the object
copy
, we also changed the birth year in
the object
original
. This is because we are using our unsafe version of the copy con-
structor. Both
original.born
and
copy.born
contain the same reference to the same
Date
object.
All this assumed that, contrary to fact, we have used the unsafe version of the copy
constructor. Fortunately, we used a safer version of the copy constructor that sets the
born
instance variables as follows:
born =
new
Date(original.born);
which is equivalent to
this
.born =
new
Date(original.born);