자바 플랫폼 라이브러리에는 인스턴스화 가능한 클래스가 있습니다.
클래스에 추가하고 값 구성 요소를 추가하십시오. 예를 들어, java.sql.Timestamp
java.util.Date를 상속 해, 나노초 필드를 추가합니다. equals 구현
timestamp가 대칭을 위반하고 불규칙한 동작을 일으킬 수있는 경우
타임 스탬프 및 날짜 객체는 동일한 컬렉션에서 사용되거나 그렇지 않으면 혼합됩니다.
Timestamp 클래스에는 프로그래머에게 경고하는 면책 조항이 있습니다.
날짜와 타임 스탬프를 섞는다. 당신이 문제가되지 않는 한
그것들을 분리하여 보관하십시오.
결과 오류는 디버그하기가 어려울 수 있습니다. Timestamp 클래스의이 동작은
실수하고 모방해서는 안됩니다.
값 구성 요소를 추상 클래스의 하위 클래스에 추가 할 수 있습니다.
동등한 계약을 위반하지 않고 이것은 클래스 계층의 종류에 중요합니다.
항목 20, "클래스 계층 구조를 선호하십시오."
태그가 붙은 클래스 "가 될 수 있습니다. 예를 들어,
값 구성 요소, 반지름 필드를 추가하는 하위 클래스 Circle 및 하위 클래스
길이와 폭 필드를 추가하는 사각형. 위에 표시된 종류의 문제
수퍼 클래스 인스턴스를 직접 생성하는 것이 불가능할 때까지는 발생하지 않습니다.
일관성 - equals 계약의 네 번째 요구 사항은 두 개
객체가 동일하다면, 그것들 중 하나 (또는 둘 모두)가 아니면
수정되었습니다. 다시 말해, 변경 가능한 객체는 다른 객체와 동일 할 수 있습니다.
불변의 객체는 다른 시간을 가질 수 없다. 당신이 수업을 쓸 때, 열심히 생각하십시오.
그것이 불변이어야하는지 여부에 관한 것이다 (항목 15). 당신이해야한다고 결론을 내리면,
equals 메소드가 동등한 객체에 대한 제한을 적용하는지 확인하십시오.
평등하게 유지되고 불평등 한 물체는 항상 평등하지 못합니다.
클래스가 불변 일지 어떨지에 관계없이, equals 메소드를 작성하지 말아주세요.
신뢰할 수없는 자원에 의존합니다. 일관성을 만족시키는 것은 극히 어렵습니다.
이 금지 조항을 위반하는 경우 예를 들어, java.net.URL
equals 메소드는, 관련 지을 수 있었던 호스트의 IP 주소의 비교에 의존합니다.
URL로 호스트 이름을 IP 주소로 변환하면 네트워크가 필요할 수 있습니다.
액세스 할 수 있으며 시간이 지남에 따라 동일한 결과가 산출되는 것은 아닙니다. 이로 인해
URL이 equals 계약을 위반하는 메소드와 같아서
연습. (불행히도이 동작은 호환성 때문에 변경할 수 없습니다.
요구 사항.) 거의 예외는 없지만 equals 메소드는 결정 론적 메모리 상주 객체에 대한 계산합니다.
마커 인터페이스는 메소드 선언을 포함하지 않는 인터페이스이지만
인터페이스를 구현하는 클래스를 단지 (또는 "표시"하는) 것으로 지정합니다
어떤 재산. 예를 들어 Serializable 인터페이스 (11 장)를 생각해보십시오.
이 인터페이스를 구현함으로써 클래스는 인스턴스를 작성할 수 있음을 나타냅니다.
ObjectOutputStream (또는 "직렬화 된").
마커 주석 (Item 35)이 마커 인터페이스를 생성한다고 들었을 것입니다
쓸데없는. 이 주장은 잘못되었습니다. 마커 인터페이스에는 두 가지 장점이 있습니다.
오버 마커 주석. 맨 먼저 마커 인터페이스는 유형을 정의합니다.
표시된 클래스의 인스턴스에 의해 구현됩니다. 마커 주석
아니. 이 유형의 존재는 컴파일 타임에 오류를 잡을 수있게합니다.
마커 주석을 사용한 경우 런타임까지 캐치 할 수 없습니다.
Serializable 마커 인터페이스의 경우, ObjectOutputStream.write (Object)
메소드가 인수를 구현하지 않으면 메소드가 실패합니다.
인터페이스. 설명 할 수 없게도, ObjectOutputStream API의 작성자는
write 메소드를 선언 할 때 Serializable 인터페이스의 이점. 그만큼
메서드의 인수 형은 Object가 아니고 Serializable가 아니면 안된다. 같이
ObjectOutputStream.write를 호출하지 않는 객체에 대한 호출 시도.
Serializable를 구현하는 것은 런타임에만 실패하지만, 그렇게 할 필요는 없습니다.
방법.
마커 주석보다 마커 인터페이스의 또 다른 장점은
더 정확하게 타겟팅 할 수 있습니다. 어노테이션 유형이 target ElementType.TYPE으로 선언 된 경우,
모든 클래스 또는 인터페이스에 적용 할 수 있습니다. 당신이
마커는 특정 인터페이스의 구현에만 적용 할 수 있습니다. 만약 너라면
그것을 마커 인터페이스로 정의하면, 인터페이스를 마커 인터페이스로 확장 할 수 있습니다
표시된 모든 유형이 유일한 하위 유형이기도합니다
인터페이스가 적용 가능합니다.
아마 Set 인터페이스는 제한된 마커 인터페이스 일뿐입니다. 그것은
Collection 하위 유형에만 적용 할 수 있지만 그 이상의 메소드는 추가하지 않습니다.
컬렉션에 의해 정의됩니다. 일반적으로 마커 인터페이스로 간주되지 않습니다.
왜냐하면 그것은 여러 가지 Collection 메소드의 계약을 정제하기 때문이다. add,
equals 및 hashCode 그러나 적용 할 수있는 마커 인터페이스를 쉽게 상상할 수 있습니다.
일부 특정 인터페이스의 하위 유형에만 적용되며 계약을 구체화하지 않습니다.
그 인터페이스의 메소드의 어떤 것인가. 이러한 마커 인터페이스는
전체 객체의 일부 불변 또는 인스턴스가 처리에 적합 함을 나타냅니다.
다른 클래스의 메소드에 의해 (Serializable 인터페이스
인스턴스가 ObjectOutputStream에 의해 처리 할 수있는 것을 나타냅니다).