public
final
class
ImmutableClass
{
/**
* Integer class is immutable as it does not provide any setter to change its content
* */
private
final
Integer immutableField1;
/**
* String class is immutable as it also does not provide setter to change its content
* */
private
final
String immutableField2;
/**
* Date class is mutable as it provide setters to change various date/time parts
* */
private
final
Date mutableField;
//Default private constructor will ensure no unplanned construction of class
private
ImmutableClass(Integer fld1, String fld2, Date date)
{
this
.immutableField1 = fld1;
this
.immutableField2 = fld2;
this
.mutableField =
new
Date(date.getTime());
}
//Factory method to store object creation logic in single place
public
static
ImmutableClass createNewInstance(Integer fld1, String fld2, Date date)
{
return
new
ImmutableClass(fld1, fld2, date);
}
}