유효성 검사 시점/객체 사용 시점에 원본 객체를 수정하여 공격
// 생성자로 받은 객체 방어적 복사
public Period(Date start, Date end) {
this.start = new Date(start.getTime()); // defensive copy
this.end = new Date(end.getTime()); // defensive copy
if (this.start.compareTo(this.end) > 0) {
throw new IllegalArgumentException("start가 end보다 늦으면 안된다");
}
}
// getter 방어적 복사
public Date getStart() {
return new Date(start.getTime());
}
public Date getEnd() {
return new Date(end.getTime());
}
private static final Integer[] PRIVATE_VALUES = new Integer[]{ 1,2,3 };
public static final List<Integer> VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
만약 생성자를 통해서 전달된 데이터가 변경가능한 객체일 때 이를 복사하기 위해서 clone() 메소드를 호출하고 싶을 때는 해당 클래스가 final로서 추가적으로 상속가능한 클래스가 아니어야 한다.
그 이유는 추가적으로 상속할 수 있는 경우 해당 객체의 clone()메소드를 실행 했을 때, 해당 객체가 반환된다고 보장할 수 없기 때문이다.
출처: https://wedul.site/294 [wedul]
# [객체지향] 방어적 복사 - 2
## 내용
- 원본 객체 수정을 방지하기 위해 List 반환 시에 새로운 리스트를 생성하여 반환
## 링크
- https://velog.io/@jh8579/%EB%B0%A9%EC%96%B4%EC%A0%81-%EB%B3%B5%EC%82%AC%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4
public List<Card> shuffleCards() {
List<Card> cards = new ArrayList<>(deck);
Collections.shuffle(cards);
return new ArrayList<>(cards);
}