Java Creating Immutable Subclasses

I have the following abstract class:

    public abstract class Client {

       final private String anonymousCilentID;
       final private String anonymousCilentFirstName;
       final private String anonymousCilentLastName;
       final private String gender;

            protected Client(String anonymousCilentID, String anonymousCilentFirstName, String anonymousCilentLastName, String gender) {
                this.anonymousCilentID = anonymousCilentID;
                this.anonymousCilentFirstName = anonymousCilentFirstName;
                this.anonymousCilentLastName = anonymousCilentLastName;
                this.gender = gender;
            }

        public String getAnonymousCilentID() {
            return anonymousCilentID;
        }

        public String getAnonymousCilentFirstName() {
            return anonymousCilentFirstName;
        }

        public String getAnonymousCilentLastName() {
            return anonymousCilentLastName;
        }

        public String getGender() {
            return gender;
        }
    }

and the following subclass:

final public class AnonymousCilent extends Client {


   final private Date arrivalDate;
   final private String immStatus;
   final private Date registrationDate;
   final private String registrationSite;
   final private String siteName;
   final private String comments;



final public class AnonymousCilent extends Client {


   final private Date arrivalDate;
   final private String immStatus;
   final private Date registrationDate;
   final private String registrationSite;
   final private String siteName;
   final private String comments;

    public AnonymousCilent(String anonymousCilentID, String anonymousCilentFirstName, String anonymousCilentLastName, String gender, Date arrivalDate, String immStatus, Date registrationDate, String registrationSite, String siteName, String comments) {

        super(anonymousCilentID,anonymousCilentFirstName, anonymousCilentLastName, gender);

        this.arrivalDate = arrivalDate;
        this.immStatus = immStatus;
        this.registrationDate = registrationDate;
        this.registrationSite = registrationSite;
        this.siteName = siteName;
        this.comments = comments;
    }


    public Date getArrivalDate() {

        return new Date (arrivalDate.getTime());
    }

    public String getImmStatus() {
        return immStatus;
    }

    public Date getRegistrationDate() {
        return new Date (registrationDate.getTime());
    }

    public String getRegistrationSite() {
        return registrationSite;
    }

    public String getSiteName() {
        return siteName;
    }

    public String getComments() {
        return comments;
    }
}

I need to create a subclass, but I want to do what works best for creating immutable classes. I assigned my abstract constructor as protected, declared my variables private final / no setters. Is my subclass immutable? Did I do something in bad practice? If so, how to fix it?

+4
source share
1 answer

Your class is AnonymousCilentnot immutable because the class is java.util.Datenot immutable. I could do this:

AnonymousCilent object = ...;

// Modifies the Date object held by the AnonymousCilent object
object.getArrivalDate().setDate(23);

To prevent this, getters for Date objects should return copies of member variables, for example:

public Date getArrivalDate() {
    // Return a copy of member variable arrivalDate
    return new Date(arrivalDate.getTime());
}

Java 8 java.time, , java.util.Date, Joda Time Java 8.

+4

All Articles