[아이템 50]적시에 방어적 본사본을 만들라
IT 개발/개념 정리
2022. 7. 22. 22:00
클라이언트가 여러분의 불변식을 깨드리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다.
Date 대신 불변(아이템 17)인 Instant, LocalDateTime, ZonedDateTime을 사용하면 된다.
외부 공격으로부터 Period 인스턴스의 내부를 보호하려면 생성자에서 받은 가변 매개변수 각각을 방어적으로 복사(defensive copy)해야 한다. 그런 다음 Period 인스턴스 안에서는 원본이 아닌 복사본을 사용한다.
매개변수가 제3자에 의해 확장될 수 있는 타입이라면 방어적 복사본을 만들 때 clone을 사용해서는 안 된다.
접근자가 가변 필드의 방어적 본사본을 반환하면 된다.
내부에서 사용하는 배열을 클라이언트에 반환할 때는 항상 방어적 복사를 수행해야 한다. 혹은 배열의 불변 뷰를 반환하는 대안도 있다.
private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
메서드나 생성자의 매개변수로 넘기는 행위가 그 객체의 통제권을 명백히 이전함을 뜻하기도 한다. 불변식이 깨지더라도 그 영향이 오직 호출한 클라이언트로 국한될 때로 한정해야한다. (래퍼 클래스 패턴을 예로 들 수 있다.)
반응형
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 54] null이 아닌, 빈 컬렉션이나 배열을 반환하라 (0) | 2022.07.29 |
---|---|
[아이템 51] 메서드 시그니처를 신중히 설계하라 (0) | 2022.07.22 |
[아이템 49] 매개변수가 유효한지 검사하라 (0) | 2022.07.22 |
[Git] .gitignore적용 방법 (0) | 2022.07.20 |
[아이템 39] 명명 패턴보다 애너테이션을 사용하라 (0) | 2022.06.21 |