Почему мы должны делать Оборонительное копирование, чтобы достичь Непрерывного класса? Посмотрите на этом коде:Java Оборонительное копирование и непреодолимое
public final class EmailMessage {
private final String from;
private final String to;
private final String message;
private final Date date;
public EmailMessage(String from, String to, String msg, Date date)
{
this.to = to;
this.from = from;
this.message = msg;
this.date = new Date(date.getTime());// instead of date;
}
public String getFrom()
{
return(from);
}
public Date getDate() {
return(new Date(date.getTime()); // instead of Date
}
}
Почему это не будет Неизменным, если мы не делали оборонительное копирование?
, потому что 'date' класс является изменяемым, даже если объявить его экземпляр окончательным, стоимость все еще могут быть изменены 'setDay()' и другими сеттерами. Копирование 'date' из аргумента конструктора, вы не можете гарантировать, что ссылки не будут храниться во внешнем коде, что позволит изменить. –
Эта проблема плохого дизайна решена в пакете 'java.util.time' в Java 8, где вы должны использовать' LocalDate', 'LocalTime' и другие классы, которые являются полностью неизменными и безопасными. –
вы можете использовать jodatime для удаления проблем с дизайном или java.util.time (из Java 8) – ha9u63ar