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

Joseph D. Darcy Joe.Darcy at Sun.COM
Mon Oct 12 17:25:42 UTC 2009


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



More information about the core-libs-dev mailing list