2016-10-15 11 views
0

교육 목적으로 자바 값 객체를 조사 중입니다.자바 값 객체 정의

내가 이해하지 못하는 이유는 Java Value Objects가 Comparable을 구현하는 것을 (아무리 호흡하는) 누구도 언급하지 않는 이유입니까?

Java 값 개체에 "올바른"HashCode가 있어야하는 경우 & 동등한 이유로 같음 Comparable CompareTo 메서드가 있어야하지 않는 이유는 무엇입니까?

내 생각은 다음과 같습니다. 값 객체의 인스턴스는 동일하게 테스트되므로 올바른 equals/hashcode가 필요합니다. 값 개체가 "해시"컬렉션에 저장 될 수 있으며, 다시 Hashcode 메서드가 필요합니다. 그렇다면 Comparable을 추가하지 않아도 Ordered 컬렉션의 키가 될 수 있습니까?

+0

왜 그들은 compareTo 메소드를 구현해야합니까? –

+0

현재 사용중인 값 개체의 정의에 대한 참조가 있습니까? 그러나 귀하의 질문은 거의 다음과 같이 읽습니다. "왜이 개념을 정의한 사람들은이 다른 개념을 포함하지 않았습니까?"그리고 이러한 질문은 원저자에게 직접 질문 할 수 없으면 대답하기가 어렵지 않을 수도 있습니다. –

답변

4

나는 주된 이유는 당신이 지정하는 어떤 가치 객체에 대해서도, 그것의 인스턴스를 주문하는 여러 가지 방법이있을 수있는 반면, 진정으로 평등에 대한 하나의 정의 만 있다는 것입니다. 평등의 고유 한 정의는 equals()을 재정의해야합니다 (기본값이 충분하지 않은 경우). 일단 문서에서 언급 한 모든 이유로 일치 hashCode() 구현을 제공해야합니다.

그러나 값 객체 클래스의 인스턴스를 주문하려면 Comparable을 구현할 필요가 없으며 실제로 여러 가지 방법으로 주문하려는 경우에는 사용하지 않아도됩니다. 단순한 익명 인라인 Comparator 구현을 정렬 메서드에 전달하기 만하면 다른 순서로 다른 비교기 구현이 가능합니다. Java 8 및 lambda 이후 어느 때보 다 쉬워졌습니다. 최근 몇 년 동안 나 자신은 Comparable을 구현하는 것을 멀리하고있다.

물론 특정 값의 개체 클래스에 대한 자연 순서가있는 경우 물론, 반드시 Comparable을 구현하십시오. 이 경우 귀하의 equals() 구현과 일치하는지 확인하십시오.