문제

이 질문은 특히 관련된 재정의하 equals()메소드에 대한 개체의 큰 숫자와 함께 필드가 있습니다.첫째,내가 말하는 이 대체할 수 없는 손으로 여러 구성품을 위반하지 않고 OO 원리,그래서 말해요"아래에 이상이 있어야 x 필드"도움이되지 않습니다.

이에,문제가 되었는 결실할 때 나는 잊을 확인하는 필드 중 하나에 대한 평등.따라서,내 같음 방법은 잘못되었습니다.그때 생각했을 사용하여 반사:

--code removed because it was too distracting--

이 게시물의 목적지 않는 반드시 형식 코드(이하지 않더라도 코드를 사용하고),그러나 대신하는지 여부에 이것은 좋은 생각이 아니다.

장점:

  • 는 경우 새로운 분야를 추가되는,그것은 자동으로 포함됩
  • 이 방법은 훨씬 더 간결한다 문 30 만일

단점:

  • 는 경우 새로운 분야를 추가되는,그것은 자동으로 포함되,때로 이것은 바람직하지 않은
  • 성능:이것은 속도가 느린되,나는 필요성을 느끼지 않을 즐 프로파일
  • 화 특정 필드를 무시하면 비교를 조금 못생긴

어떤 생각?

도움이 되었습니까?

해결책

성능상의 이유로 화이트리스트를 원한다면 주석을 사용하여 비교할 필드를 표시하십시오. 또한 필드가 좋은 구현이 없다면이 구현은 작동하지 않습니다. equals().

추신이 경로를 가면 equals(), 비슷한 일을하는 것을 잊지 마십시오 hashCode().

pps 나는 당신이 이미 고려한 것을 믿습니다 해시 코드 빌더 그리고 EqualsBuilder.

다른 팁

Eclipse, FFS를 사용하십시오!

해시 코드를 삭제하고 가지고있는 메소드와 같습니다.

파일을 마우스 오른쪽 버튼으로 클릭하십시오.

소스-> 해시 코드 생성 및 동등한 ...

완료! 더 이상 반성에 대한 걱정이 없습니다.

추가 된 각 필드에 대해 반복하면 개요보기를 사용하여 두 가지 메소드를 삭제 한 다음 Eclipse가 자율적으로 중단하도록하십시오.

반사 접근 방식으로 가면 EqualsBuilder는 여전히 친구입니다.

 public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
 }

여기에 생각이 당신에 대해 걱정:

1/잊어를 업데이트 시리즈의 경우 문 검사를 위한 평등을 때 당신은 추가/제거하는 분야이다.

2/의 성능에 이렇게 equals()메소드가 있습니다.

다음과 같이 하십시오.

a/로 다시 되돌릴을 사용하여 오랜 시퀀스의 경우 문서 equals()메소드가 있습니다.

b/는 단 하나 기능 목록을 포함하는 분야(문자열 배)는 것을 확인하는 목록에 대한 현실을(즉,필드를 반영).그것은 예외가 발생하면 그들은 매치하지 않습니다.

c/에서 생성자를 위한 이 물체가 동기화 실행되면 이 함수 호출(비슷한 단일 패턴).다른 말로 하면,이것은 먼저 객체에 의해 건설하는 이 클래스는 전화 기능을 검사하는 설명서(b)above.

예외를 만들 것입니다 그것은 바로 명백한 경우 실행 프로그램 업데이트하지 않은 경우에는 귀하의한 경우-제표에 맞게 반영된 필드를;그런 다음을 수정하는 경우-진술 및 업데이트 분야에서 목록(b)above.

이후 건설의 개체하지 않습니다 이를 확인하고 당신의 equals()메소드가 실행에 그것의 최대 속도입니다.

보십시오 나는 영감을 찾을 수있을 실제 문제로 이 방법(크 마음은 존재할 수 있습에서 유래)-이 추천 상태를 확인하는 각 개체 건설을 위해 한 번 실행의 행동 하지만 보이는 상당히 작습니다.

충분히 열심히 시도 하는 경우,당신은 여전히 당신의 경우에 문의 단계 분야 목록에 반영된 필드 그러나 예외가 보드 목록과 일치하는 필드를 반영하고 당신은 단지 당신 업데이트하는 경우-문과 분야 목록에서 동일한 시간입니다.

당신은 항상 당신의 평등 방법에서 원하지 않는 필드에 주석을 달 수 있습니다. 그것은 간단하고 간단한 변화가되어야합니다.

성능은 객체가 실제로 비교되는 빈도와 분명히 관련이 있지만 많은 프레임 워크가 해시 맵을 사용하므로 생각보다 더 많이 사용될 수 있습니다.

또한 해시 맵에 대해 말하면 해시 코드 방법과 동일한 문제가 있습니다.

마지막으로, 모든 분야를 평등과 비교해야합니까?

코드에 몇 가지 버그가 있습니다.

  1. 당신은 그것을 가정 할 수 없습니다 this 그리고 obj 같은 클래스입니다. 실제로, 그것은 명시 적으로 허용됩니다 obj 다른 수업이되기 위해. 당신은 시작할 수 있습니다 if ( ! obj instanceof myClass ) return false; 그러나 이것은입니다 여전히 정확하지 않습니다 왜냐하면 obj 서브 클래스가 될 수 있습니다 this 중요 할 수있는 추가 필드가 있습니다.
  2. 당신은 지원해야합니다 nullobj 단순한 if ( obj == null ) return false;
  3. 당신은 치료할 수 없습니다 null 그리고 비어있는 문자열은 동일합니다. 대신 치료 null 특별히. 여기서 가장 간단한 방법은 비교로 시작하는 것입니다 Field.get(obj) == Field.get(this). 둘 다 동일하거나 동일한 객체를 가리키는 경우, 이것은 빠릅니다. (참고 : 이것은 또한 최적화이기도합니다. 이것은 느린 루틴이기 때문에 필요한 최적화입니다.) 이것이 실패하면 Fast를 사용할 수 있습니다. if ( Field.get(obj) == null || Field.get(this) == null ) return false; 정확히 하나 인 경우를 처리합니다 null. 마지막으로 평소를 사용할 수 있습니다 equals().
  4. 당신은 사용하지 않습니다 foundMismatch

나는 행크에 동의합니다 [HashCodeBuilder][1] 그리고 [EqualsBuilder][2] 더 나은 방법입니다. 보일러 플레이트 코드가 많지 않고 유지하기가 쉽고 이러한 모든 문제를 피합니다.

주석을 사용하여 수표에서 필드를 제외 할 수 있습니다.

예를 들어

@IgnoreEquals
String fieldThatShouldNotBeCompared;

물론 일반적인 평등 방법에서 주석의 존재를 확인하십시오.

필드의 이름에 액세스 할 수 있다면 항상 "로컬"또는 "nochk"또는 그와 비슷한 것을 포함시키지 않기를 원하지 않는 필드를 표준으로 만들지 않겠습니까?

그런 다음 이것으로 시작하는 모든 필드를 블랙리스트에 올리십시오 (코드는 그렇게 못 생겼지 않습니다).

나는 그것이 조금 느리다는 것을 의심하지 않는다. 실행 속도로 업데이트 용이성을 교환할지 여부를 결정해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top