문제

이것은 효과적인 Java에서 수비 사본의 예입니다. 시나리오가 기본적인 질문에 있음을 가정하면 수비 사본이 필요하며 클라이언트를 묻는 댓글로 할 수는 없습니다.

public Period(Date start, Date end) {
    this.start = new Date(start.getTime());
    this.end = new Date(end.getTime());
}
.

질문 :

  1. Date가 내 자신을 더 일반적으로 만들기 위해 생성자가 없어서, 객체가 자체적으로 복제하기 위해서는 오브젝트가 전달되지 않으며, 그러한 객체는 우리에게 속하지 않습니다. 어떤 방식 으로든 그것을 바꿀 수 없습니까?

  2. 생성자가 형식 매개 변수를 인수로 가져 갔을 경우, Period(T object) 및 t가 변형 된 사본이 필요하다는 것을 말할 수 있다고합니다. 우리는이 경우 방어 복사본을하는 방법에 대한 아이디어가 없습니다.

  3. 그 일부 서브 클래스의 일부는 Date와 같은 생성자를 가지고 있으며 그 자체의 객체를 만들고 일부 서브 클래스 중 일부는 그렇게 할 메커니즘이 없습니까?

  4. 우리는 얼마나 깊은 수비수로 복사해야합니까? 배열을 복사 할 수 있지만 배열 요소는 변경할 수 있었습니까?

도움이 되었습니까?

해결책

  1. 모든 상태를 사용할 수있는 경우 상태를 추출하고 새로운 객체를 직접 구성 할 수 있습니다. 그렇지 않으면 불쾌한 반사 또는 직렬화 트릭을 사용하는 것을 제외하고는 아무 것도 할 수 없습니다.
  2. t가 복사 할 수있는 클래스의 인스턴스가 아니면 아무 것도 할 수 없습니다.
  3. 당신은 그것에 대해 아무 것도 할 수 없습니다.
  4. 그것은 의존합니다.
  5. 귀하의 질문을 읽음으로써 "방어 복사본"조언을 모든 곳에서 적용하고 싶습니다. 당신은해서는 안됩니다. 대부분의 시간, 변경 가능한 객체를 사용하는 코드는 복사본이 아닌 원래 개체에 대한 참조를 원한다. 특히 인수로 얻는 것이 추상 클래스 또는 인터페이스의 인스턴스 인 경우 특히 그렇습니다.

    은 변경할 수 없어야하는 변경 가능한 가치 유형이므로 적절히 설계된 경우에는 수비 복사본을 수비 복사본을 만들어야합니다. 가치 유형에 대한 불변성을 촉진하면 방어 복사본이 불필요하게됩니다. 비 값이 아닌 유형의 경우 일반적으로 복사본이 아니라 객체에 대한 참조를 원하지 않습니다.

다른 팁

  1. 어쨌든 개체의 상태를 변경할 수없는 경우 방어 복사본이 필요하지 않습니다.
  2. 할 수있는 유일한 것은 T의 가능한 구현을 가정하고 instanceof 로 확인하는 것입니다.
  3. 2와 동일합니다.
  4. 귀하의 재량에 따라
  5. .배열 요소의 수정이 다른 장소에서 프로그램을 끊을 수 있다고 가정하면 모두를 모두 복사해야합니다.

방어 프로그래밍은 메서드에 전달하는 객체가 변경할 때 중요합니다.좋은 실습 (또한 효과적인 자바 북에서 설명)은 그들을 불변으로 만드는 것입니다.

  1. 날짜 클래스가 최종이 아닌 경우,이를 위해 래퍼 클래스를 작성할 수 있습니다. 즉, 날짜의 하위 클래스입니다.
  2. 그것은 의존합니다.아마, 그것을 복제 할 필요가 없을 것입니다.
  3. 당신을 괴롭히지 않아야합니다.인터페이스의 구현자는 동기화 문제를 해결해야합니다.일반적으로 구현 대신 인터페이스를 통과하는 것이 좋습니다.
  4. 표준 Java 컬렉션의 경우 java.util.Collections 클래스에는 수비아 프로그래밍을 위해 사용하기위한 비정규 수정 문자 및 비 미숙 한 것과 같은 많은 유틸리티 메소드가 많이 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top