j.ul.Objects follow-up: methods for var-argification?

Joseph D. Darcy Joe.Darcy at Sun.COM
Mon Oct 12 18:41:13 UTC 2009


Rémi Forax wrote:
> Le 12/10/2009 19:25, Joseph D. Darcy a écrit :
>> Joshua Bloch wrote:
>>> Joe,
>>>
>>> I'm not sure I like this idea.  My one experience with forcing an 
>>> array method to do double duty as varargs method was a disaster.  
>>> The method was Arrays.asList, and the result was Puzzler # 7 from 
>>> "The Continuing Adventures of Java™Puzzlers: Tiger Traps."  Here it is:
>>>
>>> *7. “Fib O’Nacci”*
>>>
>>> public class Fibonacci {
>>>     private static final int LENGTH = 7;
>>>     public static void main(String[] args) {
>>>         int[] fib = new int[LENGTH];
>>>         fib[0] = fib[1] = 1; // First 2 Fibonacci numbers
>>>         for (inti = 2; i < LENGTH; i++)
>>>             fib[i] = fib[i -2] + fib[i -1];
>>>         System.out.println(Arrays.asList(fib));
>>>     }
>>> }
>>>
>>> The main moral of the puzzle was:
>>>
>>> Use varargssparingly in your APIs
>>>     •It can hide errors and cause confusion
>>>     •This program wouldn't compile under 1.4
>>>
>>> Arrays.hashCode, equals, and toString are already overloaded out the 
>>> wazoo; adding varargs to the mix could be deadly.  Also, Arrays is 
>>> not the place where people would go looking for what is essentially 
>>> a hashing utility.  So I'm not in favor of varargifying the existing 
>>> methods in Arrays, but I am in favor of adding a convenience method 
>>> like this somewhere:
>>>
>>>          /**
>>>      * Generates a hash code for a sequence of input values. The 
>>> hash code is
>>>      * generated as if all the input values were placed into an 
>>> array, and that
>>>      * array were hashed by calling {@link Arrays#hashCode(Object[])}.
>>>      * <p/>
>>>      * <p>This method is useful for implementing {@link 
>>> Object#hashCode()} on
>>>      * objects containing multiple fields. For example, if an object 
>>> that has
>>>      * three  fields, {@code x}, {@code y}, and {@code z}, one could 
>>> write:
>>>      * <pre>
>>>      * @Override public int hashCode() {
>>>      *     return Objects.hashCode(x, y, z);
>>>      * }
>>>      * </pre>
>>>      * <b>Warning: When a single object reference is supplied, the 
>>> returned
>>>      * value does not equal the hash code of that object 
>>> reference.</b> This
>>>      * value can be computed by calling {@link #hashCode(Object)}.
>>>      */
>>>     public static int hash(Object... components) {
>>>         return Arrays.hashCode(components);
>>>     }
>>>
>>> Viewed in isolation, it's simple, straightforward, and will help 
>>> people write high quality hashCode methods.  I don't think Objects 
>>> is a bad place for it, but you could put it is a "hash utility" 
>>> class if we wrote such a thing.
>>>
>>
>> Okay; unless and until a hash utility is added somewhere, this 
>> hash(Object ...) can live in Objects.
>>
>> -Joe
>
> In that case, we can also add some methods hash that avoid create an 
> array
> for let say 2 to 5 arguments:
> hash(Object, Object), hash-Object, Object, Object), 
> hash(Object,Object,Object,Object)
> and hash(Object,Object,Object,Object,Object).
>

I don't think such methods are justified at present.

-Joe




More information about the core-libs-dev mailing list