Interfaces
Cloneable interface
The Cloneable interface is defined as follows:
public interface Cloneable { }This interface is empty. An interface with an empty body is referred to as a Marker Interface. A marker interface does not contain constants or methods. It is used to denote that a class possesses certain desirable properties. A class that implements the Cloneable interface is marked cloneable, and its objects can be cloned using the clone() method defined in the Object class.
How to clone a user-defined class
- If a user-defined class implements the Cloneable interface, you can clone the class using the clone method of the Object class.
- The clone method in the Object class has protected access. To make it available to all classes, you can override it with a clone method that has public access.
- The clone method returns an Object type. As a result, you may need to cast the result of this method to another type of class.
- The clone method of the Object class throws a CloneNotSupportedException. A class that overrides this method must throw or catch this exception or it won't compile.
A Product class that implements the Cloneable interface
public class Product implements Cloneable { private String code; private String description; private double price; // the code for the constructor and methods public Object clone() throws CloneNotSupportedException { return super.clone(); } }
Code that uses the clone method of the Product class
// create a new product Product p1 = new Product(); p1.setCode("java"); p1.setDescription("Murach's Beginning Java 2"); p1.setPrice(49.50); // clone the product Product p2 = (Product) p1.clone(); // change a value in the cloned product p2.setPrice(44.50); // print the results System.out.println(p1); System.out.println(p2);
The resulting output
Code: java Description: Murach's Beginning Java 2 Price: $49.50 Code: java Description: Murach's Beginning Java 2 Price: $44.50
Cloning and mutable objects
- A mutable object is an object that can be changed.
- To clone an object that contains an instance variable for a mutable object, you need to override the clone method and manually clone that object.
A LineItem class that implements the Cloneable interface to clone a mutable object
public class LineItem implements Cloneable { private Product product; private int quantity; private double total; // the code for the constructors and methods public Object clone() throws CloneNotSupportedException { LineItem li = (LineItem) super.clone(); Product p = (Product) product.clone(); li.setProduct(p); return li; } }
Code that uses the clone method of the LineItem class
Product p1 = new Product(); p1.setCode("java"); p1.setDescription("Murach's Beginning Java 2"); p1.setPrice(49.50); LineItem li1 = new LineItem(p1, 3); // clone the line item LineItem li2 = (LineItem) li1.clone(); // change values in the cloned LineItem and its Product // object li2.setQuantity(2); li2.getProduct().setPrice(44.50); // print the results System.out.println(li1); System.out.println(li2)
The resulting output
Code: java Description: Murach's Beginning Java 2 Price: $49.50 Quantity: 3 Total: $148.50 Code: java Description: Murach's Beginning Java 2 Price: $44.50 Quantity: 2 Total: $89.00