[아이템 50]적시에 방어적 본사본을 만들라

클라이언트가 여러분의 불변식을 깨드리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다. Date 대신 불변(아이템 17)인 Instant, LocalDateTime, ZonedDateTime을 사용하면 된다. 외부 공격으로부터 Period 인스턴스의 내부를 보호하려면 생성자에서 받은 가변 매개변수 각각을 방어적으로 복사(defensive copy)해야 한다. 그런 다음 Period 인스턴스 안에서는 원본이 아닌 복사본을 사용한다. 매개변수가 제3자에 의해 확장될 수 있는 타입이라면 방어적 복사본을 만들 때 clone을 사용해서는 안 된다. 접근자가 가변 필드의 방어적 본사본을 반환하면 된다. 내부에서 사용하는 배열을 클라이언트에 반환할 때는 항상 방어적 복사를 수행해야 한다. 혹은 배열의 불..