2013-04-16 1 views
5

Objects.equal은 각 프리미티브 유형을 인수로받는 이유가 무엇입니까?Guava Objects.equal (Object, Object)가 원시 타입에없는 이유는 무엇입니까?

#valueOf을 통해 값을 상자에 넣거나 각 기본 문자를 자동 변속 시키지만 성능을 저하시키지 않는지 알고 있습니다. 그것은 제가 언젠가 궁금해 왔던 것입니다.

내가

public class Foo { 
    private final int integerValue; 
    private final boolean booleanValue; 
    private final Bar bar; 

    public Foo(int integerValue, boolean booleanValue, Bar bar) { 
     this.integerValue = integerValue; 
     this.booleanValue = booleanValue; 
     this.bar = bar; 
    } 

    @SuppressWarnings("boxing") 
    @Override 
    public boolean equals(Object object) { 
     if (object instanceof Foo) { 
      Foo that = (Foo) object; 

      return Objects.equal(this.integerValue, that.integerValue) 
        && Objects.equal(this.booleanValue, that.booleanValue) 
        && Objects.equal(this.bar, that.bar); 
     } 
     return false; 
    } 

    // hashCode implementation using guava also. 
} 

equals을 구현하는 가장 좋은 방법입니다 같은 뭔가를 상상? 원시적 인 값은 오토 박싱 될 것이고, (비록 조금이라도) 성능 저하를 겪을 것입니다. 나는 단지 ==을 사용할 수 있지만, 나를 위해 그것은 equals 메소드를 읽는 "흐름"을 깨뜨려 약간 추한 것입니다. 그래서 왜 구아바 lib 각 프리미티브 형식에 대한 Objects.equal 있지 않은지 궁금합니다. 누군가 대답을 알고 있습니까?

편집

각 원시 (하지만 바이트)의 MoreObjects.toStringHelper 과부하있다, 그게 내가 궁금 이유에 대한 Objects#equal을 위해 가지고 있지 하나입니다. 또한 JB Nizet 인수를 사용하면 Integer에 대해 int을 변경할 수 있기 때문에 equals 메서드가 더 안전합니다. 동일한 정확성에 대해 걱정할 필요가 없습니다.

Guava docs

+0

편집 정보 - ToStringHelper는 모든 Object 인스턴스에 공통적으로 toString()이 있으므로 Object 클래스의 멤버입니다. 도우미 자체가'int' 인수를 취하는 사실은'Object'가'int'를 포함 할 수 있기 때문입니다 ('toString()'결과에 포함될 것입니다). 희망은 그 말이 맞습니다. –

+0

하지만'int' 필드가 있기 때문에 그렇다면'Objects # equal'에도 똑같이 적용됩니다. 'Objects # equal'과는 다르지만'=='로 대체 할 수 있습니다 만, 자동 보쉬를 피하기 위해'StringHelper # add'에서 사용할 수있는 것은 아무것도 없습니다. 따라서, 원시적 인 방법. 아니면 적어도 그것이 내가 생각하는 것입니다 : P –

답변

6

난 그냥 그들을 위해 ==을 사용할 수 있지만 내게는, equals 메소드를 읽고 그것을 조금 못생긴 회전의 "흐름"을 깰 것이다.

각 원시 유형에 대해 해당 메소드의 오버로드를 Guava API에 추가 할 수있는 충분한 이유는 아닙니다. API가 노출하는 모든 메소드는 문서화, 테스트 및 유지 관리해야합니다. 유일한 이점이 미학이면 의미가 없습니다.

+2

+1, 나는 그것이 "설득력있는 * 충분한 이유"가 아니라고 말하고 싶지만." –

+0

나는이 점을 보았지만 코드를 좀 더 읽기 쉽게하기 위해 종종 작업을한다.이 경우는 아니지만이 오버로드 된 메서드를 유지하는 것이 얼마나 힘든 일인지는 모르겠다. 테스트 및 문서 외에도 알 수 없음) –

+5

비용에는 꽤 제한된 (논쟁의 여지가있는) 이익을 위해 무언가를 찾으려는 시도를하는 모든 사용자의 '객체'클래스의 Javadoc에 추가 혼란이 포함됩니다. 덧붙여, 나는'Object'라는 클래스에서 원시 타입을위한 특별한'equal' 처리를 위해 홀수를 찾을 수 있다는 것을 인정해야 할 것입니다. –

2

#valueOf를 통해 값을 상자에 넣거나 각 기본 문자를 자동 변속 시키도록 할 수 있지만 성능을 저하시키지 않으십니까?

사실,하지만 성능에 민감한 코드, 당신은 확실히 메소드를 호출하는 대신 간단한 if_icmpeq 옵 코드를 얻을 수 어쨌든 ==을 사용할 것입니다. 따라서 Objects.equal을 전혀 사용하지 않으면 성능에 민감한 코드를 작성하지 않았을 가능성이 있으며, 자동 보급 비용을 알지 못할 수도 있습니다.

Objects.equal의 원시 버전에는 이점이 없지만 여러 가지 방법을 라이브러리에 추가 할 필요는 없을 것입니다.

+0

잘 넣어. 답변 주셔서 감사합니다 : D 조 –

관련 문제