What methods should go into a java.util.Objects class in JDK 7?

Reinier Zwitserloot reinier at zwitserloot.com
Thu Sep 10 03:45:09 UTC 2009


Late to the thread, so many one-liners to various ideas uttered on the  
list:

--

This is great stuff folks. As long as I get my String.join (or  
Collections.join, or Arrays.join, or Whatever.join, as long as there's  
a join!), of course :)

--

The compareTo methods for Integer/Short/Byte/Long (Character?) should  
clearly go in the respective wrapper classes for consistency's sake,  
but there's nothing in the way of ALSO making a utilities class of  
sorts that contains all the primitive compareTo methods as well, if  
that seems useful.

--

A trick I'm reverting to rather a lot of late is to find my own jar  
file by getting a URL to my own class file as a resource, resolved  
against my own class, and then parsing this URL for the jar bit of it.  
(MyClassName.class.getResource("MyClassName.class")). There are a  
bunch of caveats here, mostly revolving around the notion that you may  
not have been loaded as a jar file, but as a directory, or via the  
network, or from a database, or who knows how? - but that's what  
returning "null" is for, surely. Something to consider, though I'm not  
entirely convinced this hack should be made legitimate by turning it  
into a library method. I doubt it's a good fit for Objects, in any case.

--

Whatever hashCode() implementation is decided on, it should probably  
mirror the way IDEs generate it when you ask them to. Specifically:

Use deepHashCode for object arrays. Yes, this means you'll get  
StackOverflows if an array contains itself. This is either (A) the  
correct action, or (B) ArrayList is broken, as it has the same  
behaviour.

Split up longs via XOR, and doubles via toLongBits -> XOR. There's  
loads of alternative algorithms that purport to be more efficient, but  
without specific domain knowledge, xor is hard to beat.

Project Lombok sticks to this plan, which is mostly derived from  
Effective Java, IIRC. Same goes for equals and toString.

--

How does Joe Average Java Programmer tell the difference between  
Objects.equals(), which simply adds null friendliness, and a  
reflection-based pseudo-automagical hashCode builder?

--

Changing Arrays.deepEquals and friends to varargs has the same problem  
as Arrays.asList for 'list literals': What do list literals and null- 
friendly equals/hashCode/toString implements have to do with arrays?  
Nothing. There's a reason google went out of their way to dress up  
"ImmutableList.of(a, b, c);" as a library, after all. Even without the  
Collections.unmodifiableList() wrapper call, Arrays.asList() is  
unwieldly and a pretty bad implementation leakage - you're trying to  
build an immutable list; the fact that you're doing so by varargsing  
your arguments into an array and turning THAT into a list is not  
something you should be confronted with when reading code. I'd much  
prefer a solution that did not involve java.util.Arrays.

--

toString() is not supposed to be something you ever rely upon, and I  
furthermore have a rather hard time imagining anybody can possibly be  
relying on the random-esque default toString() implementation, which  
combines a memory pointer with a class name. So, would it be an option  
to change toString()'s implementation to do the sane thing?  
Arrays.toString (deepToString? That can cause StackOverflows...) for  
arrays, and some reflection-based magic otherwise? Changing equals()  
and hashCode() is not so simply modified without causing serious  
backwards compatibility issues, unfortunately.


  --Reinier Zwitserloot


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20090910/fc701e1c/attachment.html>


More information about the core-libs-dev mailing list