Get/Set in java and reference

Get / Set methods are there to protect my class fields.

But since Java is working with reference my private fields are still getting exposed..

e.g.

private Date d;

Date getDate(){
  return d;
}

void setDate(Date inD){
//Checks for inD 
d = inD;
}


//Still the issue is 

getDate().setHours(xyz);

What is the correct approach? Because i dont want to change my Date without using setDate.

Jon Skeet
people
quotationmark

Because i dont want to change my Date without using setDate.

Then you shouldn't return a reference to a mutable object in your get method. For example:

private Date d;

Date getDate() {
  // Return a reference to an independent copy of the original data
  return new Date(d.getTime());
}

void setDate(Date inD) {
    // Checks for inD 
    d = inD;
}

A better approach (IMO) would be to use immutable types for your fields - the Joda Time API is a much cleaner date/time library and it has plenty of immutable types.

Now that was just an example of course - in other cases you might want to return an immutable view on a mutable object (which you would usually avoid mutating yourself) in order to avoid having to copy a lot of data on each get call.

people

See more on this question at Stackoverflow