I have created an employee object to be immutable.
package com.immutable.ex01; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public final class Employee implements Cloneable, Externalizable{ private final Integer age; private final String name; private final List<String> companies; private final Date dob; public Employee(Integer age, String name,List<String> companies, Date dob) { this.age = age; this.name = name; this.companies = companies; this.dob = dob; } public Integer getAge() { return this.age; } public String getName() { return this.name; } public Date getDob() { Calendar cal = Calendar.getInstance(); cal.setTime(this.dob); return cal.getTime(); } public List<String> getCompanies() { List<String> clone = new ArrayList<String>(this.companies.size()); for(String companyName : this.companies) { clone.add(companyName); } return clone; } @Override public String toString() { StringBuffer strb = new StringBuffer(); strb.append("AGE").append(" ").append(this.age) .append(", NAME ").append(this.name) .append(", DOB ").append(this.getDateString()) .append(", COMPANIES WORKED IN "); for(String companyName : this.companies) { strb.append(companyName).append(","); } strb.deleteCharAt(strb.length() - 1); return strb.toString(); } @Override public Object clone() throws CloneNotSupportedException{ throw new CloneNotSupportedException("Cannot be cloned"); } @Override public void writeExternal(ObjectOutput out) throws IOException { throw new IOException("This operation is not supported"); } @Override public void readExternal(ObjectInput in) throws IOException { throw new IOException("This operation is not supported"); } private String getDateString() { String date = null; DateFormat df = null; try { df = new SimpleDateFormat("dd MMM yyyy"); date = df.format(this.dob); }catch(Exception e) { e.printStackTrace(); } return date; } } My main method class
package com.immutable.ex01; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class MainTest01 { public static void main(String [] args) { Employee emp = null; List<String> companyList = null; Date date = null; try { companyList = new ArrayList<String>(); companyList.add("IBM"); companyList.add("Google"); companyList.add("Norton"); companyList.add("Seable"); companyList.add("Nekki"); date = toDate("28 Oct 1981"); emp = new Employee(23, "John Molkovich", companyList, date); date = emp.getDob(); date = new Date(); companyList = emp.getCompanies(); companyList.add("Toyo Corp"); System.out.println(emp); }catch(Exception e) { e.printStackTrace(); } } private static Date toDate(String dateString) throws Exception{ Date d = null; DateFormat df = new SimpleDateFormat("dd MMM yyyy"); d = df.parse(dateString); return d; } } Please review my code and check if I have achieved immutability for my employee class.