제3 9 조 필요 시 보호 복사

가설 류 의 클 라 이언 트 는 이러한 제약 조건 을 파괴 할 수 있 도록 최선 을 다 할 것 이 므 로 보호 적 인 디자인 프로그램 이 필요 합 니 다.demo:
import java.util.Date;

public final class Period {
	private final Date start;
	private final Date end;
	public Period(Date start,Date end) {
		if(start.compareTo(end) > 0){
			throw new IllegalArgumentException(start + " after " + end);
		}
		this.start = start;
		this.end = end;
	}
	
	public Date start(){
		return start;
	}
	
	public Date end(){
		return end;
	}
	//remainder omitted
}
이런 종 류 는 문제 가 없어 보이 고 시간 은 바 꿀 수 없다.하지만 Date 클래스 자 체 는 가 변 적 입 니 다.
		Date start = new Date();
		Date end = new Date();
		Period period = new Period(start, end);
		end.setYear(78);
		System.out.println(period.end());
Period 인 스 턴 스 의 내부 정 보 를 보호 하기 위해 수정 되 지 않도록 문제 가 발생 하지 않도록 구조 기의 모든 가 변 적 인 매개 변 수 를 보호 복사 (defensive copy) 하 는 것 이 필요 하 다.
	public Period(Date start,Date end) {
		this.start = new Date(start.getTime());
		this.end = new Date(end.getTime());
		if(this.start.compareTo(this.end) > 0){
			throw new IllegalArgumentException(this.start + " after " + this.end);
		}
	}		

보호 적 복사 본 은 매개 변수의 유효성 을 검사 하기 전에 이 루어 진 것 이 며, 유효성 검 사 는 원본 대상 이 아니 라 복사 후의 대상 을 대상 으로 한다.
매개 변수 유형 이 신뢰 할 수 없 는 사각형 화 된 매개 변 수 는 clone 방법 으로 보호 복사 하지 마 십시오.
Period 변경:
		Date start = new Date();
		Date end = new Date();
		Period period = new Period(start, end);
		period.end().setYear(98);
		System.out.println(period.end());
2 차 공격 을 막 기 위해 end () 를 복사 대상 으로 되 돌려 보 낼 수 있다.
	public Date end(){
		return new Date(end.getTime());
	}

하지만 이렇게 쓰 면 경솔 하기 때문에 필요 성 을 파악 해 야 한다.
매개 변수의 보호 복사 성 은 가 변 류 만 을 대상 으로 하 는 것 이 아니다.작성 방법 과 구조 기 를 작성 할 때마다 고객 이 제공 하 는 대상 이 내부 데이터 구조 에 들 어 갈 수 있 도록 허락 하려 면 고객 이 제공 하 는 대상 이 가 변 적일 수 있 는 지, 내 가 이러한 가 변 을 용인 할 수 있 는 지 를 고려 할 필요 가 있다.특히 list, map 같은 연결 요 소 를 사용 할 때.
내부 구성 요소 가 클 라 이언 트 에 게 되 돌아 갈 때 내부 에서 인용 한 데 이 터 를 되 돌려 줄 수 있 는 지 를 고려 해 야 합 니 다.또는 복사 본 을 사용 하지 않 아 도 가 변 적 이지 않 은 대상 으로 돌아 갈 수 있다.예 를 들 어 Colletions. unmodifiebleList (List list)
클 라 이언 트 에서 받 거나 클 라 이언 트 로 돌아 가 는 가 변 구성 요소 가 있다 면 클래스 는 이 구성 요 소 를 보호 적 으로 복사 해 야 합 니 다.복사 비용 이 제한 되 고 신뢰 하 는 클 라 이언 트 가 수정 하지 않 거나 적당 한 수정 을 하지 않 으 면 문서 에서 클 라 이언 트 호출 자의 책임 (수정 하지 않 거나 어떻게 효과적으로 수정 하 는 지) 을 밝 혀 야 합 니 다.
특히 가 변 구성 요소 의 수명 주기 가 길 거나 여러 층 으로 전 달 될 때 숨겨 진 문제 가 튀 어 나 오 는 것 이 무 섭 습 니 다.

좋은 웹페이지 즐겨찾기