Mutable Immutable and Cloneable Objects Chapter 15 Chapter
Mutable, Immutable, and Cloneable Objects Chapter 15
Chapter Contents Mutable and Immutable Objects • Companion Classes • Using Inheritance to Form Companion Classes Cloneable Objects A Sorted List of Clones Cloning an Array Cloning a Chain 2
Mutable and Immutable Objects A mutable object belongs to a class that has mutator or set methods for its data fields The client uses set methods to change values of the object's data fields Fig. 15 -1 An object and its reference variable chris 3
Mutable and Immutable Objects Done by executing chris. set. Last ("Smith"); Fig. 15 -2 An object in the list name. List (a) initially; (b) after the reference variable chris is used to change it 4
Mutable and Immutable Objects Immutable object belongs to a class that does NOT have mutator or set methods Class said to be read only Placing immutable objects in a sorted list is a way to prevent the client from destroying the order of the list Use an immutable object if it will be shared Use a mutable object if its data will change frequently 5
Companion Classes If it is necessary to alter an immutable object • Can be accomplished by having a companion class of corresponding mutable objects Also helpful to have methods that convert an object from one type to another 6
Companion Classes Fig. 15 -3 the classes Name and Immutable. Name 7
Companion Classes Java's String class is a read-only class • Instances of String are immutable Java provides a companion class, String. Buffer • Has a constructor that takes an instance of String as an argument • Has the to. String method that converts a mutable instance of String. Buffer to an immutable instance of String 8
Companion Classes Inheritance can be used to form companion classes Text shows declaration of Immutable. Name Then uses this to declare the derived class Name • Invokes protected methods of base class • Adds mutator methods It is best to derive the mutable class from the immutable class 9
Companion Classes Fig. 15 -4 The class Name is derived from the class Immutable. Name 10
Cloneable Objects A clone is a copy of an object The Object class contains a protected method clone that returns a copy of an object • The implementation of any method can invoke clone • Clients cannot invoke clone unless the class overrides it, declares it public class My. Class implements Cloneable {. . . 11
Cloneable Objects Fig. 15 -5 (a) A shallow clone; (b) a deep clone. 12
Cloneable Objects Fig. 15 -6 An instance of Name and its shallow clone. 13
Cloneable Objects Fig. 15 -7 A clone after one of its data fields is changed. 14
Cloneable Objects A clone method for class Student that does a deep copy public Object clone() { try { Student the. Copy = (Student)super. clone(); the. Copy. full. Name = (Name)full. Name. clone(); return the. Copy; } catch (Clone. Not. Supported. Exception e) { throw new Error(e. to. String()); } } // end clone 15
Cloneable Objects Fig. 15 -8 An instance of Student and its clone, including a deep copy of full. Name. 16
Cloneable Objects Fig. 15 -9 A shallow copy of full. Name. 17
Tasks for a clone Method Invoke the clone method of the superclass with super. clone() Enclose call to clone in a try block Write a catch block to handle exception of Clone. Not. Supported. Exception • Skip if super. clone() invokes a public clone method Clone mutable data fields of object super. clone() returned, when possible Return the clone 18
A Sorted List of Clones Recall problem of placing mutable objects in an ADT (such as a sorted list) If object is cloned before it is added to an ADT • Client could access/change the ADT's data only by using ADT operations • Requires that object added to the ADT be Cloneable 19
A Sorted List of Clones Fig. 15 -10 An ADT and its client after the clone of an object is added to the ADT. 20
A Sorted List of Clones Fig. 15 -11 The effect of get. Entry if it did not return a clone. 21
A Sorted List of Clones Fig. 15 -12 The effect of get. Entry when it does return a clone. 22
Cloning an Array To make a deep clone of an array a of cloneable objects • The class must implement Cloneable • Invoke a. clone() • Clone each object in the array Thing[ ] cloned. Array = (Thing[ ])my. Array. clone(); for (int index = 0; index < my. Array. length; index++) cloned. Array[index] = (Thing)my. Array[index]. clone(); 23
Cloning a Chain The ADT list class must implement the interface Cloneable public class LList implements List. Interface, Cloneable { private Node first. Node; // reference to first node private int length; // number of entries in list. . . 24
Cloning a Chain Fig. 15 -13 A list that stores its data in a linked chain and its shallow clone. 25
Cloning a Chain Fig. 15 -14 A list that stores its data in a linked chain and its deep clone. 26
- Slides: 26