Closed GoogleCodeExporter closed 9 years ago
Objects.hashCode() will do most of this for you. For the rest, it would be
possible
to add methods (though not overloads), but it's not immediately clear to me what
benefit that would provide.
Objects.hashCode() does almost exactly what you want for arrays of objects.
Due to
autoboxing, double values are converted to Double instances, etc.
Double.hashCode()
is defined just as Effective Java recommends. A sample of the other Number
classes
suggests the same is true there. (Boolean is slightly different from EJ, but
it's
likely that that decision was made for a reason and that, even if not, most
users
won't need to guarantee that 0 and 1 are the two values chosen.) Finally,
Objects.hashCode() treats null as an object with a hash code of zero.
The primary difference from what you appear to be asking for (correct me if I'm
wrong) is that Objects.hashCode() operates on an array of objects. This means
that
Objects.hashCode(x) == 31 + x.hashCode(), while I believe that what you want is
Objects.hashCode(x) == x.hashCode(). Providing single-argument overloads for
Objects.hashCode() with the desired behavior would make calls to
Objects.hashCode(x)
ambiguous between the varargs and single-argument forms.
A change in naming (Objects.singleObjectHashCode() or something shorter) would
solve
this problem, but I'm curious as to whether Objects.hashCode(x) == x.hashCode()
is a
hard requirement or whether it was just the logical thing to do for a
single-argument
method. Given that Objects.hashCode() already handles primitive hash codes
properly,
is there still a need for the overloads?
Original comment by cpov...@google.com
on 25 Aug 2008 at 8:07
My main reason for requesting this is to prevent unnecessary autoboxing when
calculating the hashCode for a
primitive. The ideal place to put this would be on the primitive wrapper
classes (see
http://smallwig.blogspot.com/2007/11/minor-api-fixes-for-jdk-7.html). However,
without that possibility,
can I change my request to be to add a new helper class called Primitives.
This would have the overrides for
hashCode(P) for primitives (as listed above).
This class could also have equals(P,P) methods for all primitives, that use
{Float,Double}.compare or == as
appropriate (as recommended by Item 8 in Effective Java).
Original comment by Ben.Lings
on 25 Aug 2008 at 8:51
+1 to standardized primitive hashing functions
Re #2: "This class could also have equals(P,P) methods for all primitives, that
use
{Float,Double}.compare"
Why not just expose "compare" methods for the primitives then?
Original comment by estebis...@gmail.com
on 3 Sep 2008 at 7:53
The Comparators class already has compare methods for the primitives.
Original comment by jared.l....@gmail.com
on 4 Sep 2008 at 12:45
Right-o. Forgot about that as I generalized his "equals" request...
Back to the main issue in the bug, the hashCode methods would be nice.
Original comment by estebis...@gmail.com
on 4 Sep 2008 at 2:42
I want to get out of the primitives business in this library. There are *many*
primitive-oriented features that are desirable but they should go in a
primitive-oriented library. Sorry.
Original comment by kevin...@gmail.com
on 29 Dec 2008 at 8:43
Original issue reported on code.google.com by
Ben.Lings
on 25 Aug 2008 at 7:12