item 50 : 적시에 방어적 복사본을 만들라
1. 잘못 사용해서 클래스 내부 수정을 허락하는 경우의 문제점과 해결방법
1) 클래스 내부 수정을 본의 아니게 허락하는 경우
/ 코드 50-1 기간을 표현하는 클래스 - 불변식을 지키지 못했다. (302-305쪽)
public final class Period {
private final Date start;
private final Date end;
/**
* @param start 시작 시각
* @param end 종료 시각. 시작 시각보다 뒤여야 한다.
* @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다.
* @throws NullPointerException start나 end가 null이면 발생한다.
*/
public Period(Date start, Date end) {
if (start.compareTo(end) > 0)
throw new IllegalArgumentException(
start + "가 " + end + "보다 늦다.");
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
public String toString() {
return start + " - " + end;
}2) 문제점: 가변 객체로 인해 의도와 다르게 값이 변경될 수 있음

3) 해결방법 1 : 방어적 복사 사용
4) 해결방법 2 : 픧드의 방어적 복사본을 반환한다.

5) 방어적 복사를 위한 clone() 사용 고려
clone() 사용 고려6) 방어적 복사를 생략해도 되는 상황
2. 추가적으로 고려해야 할 사항
📚 핵심 정리
Last updated