<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Late to the thread, so many one-liners to various ideas uttered on the list:</div><div><br></div><div>--</div><div><br></div><div>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 :)</div><div><br></div><div>--</div><div><br></div><div>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.</div><div><br></div><div>--</div><div><br></div><div>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.</div><div><br></div><div>--</div><div><br></div><div>Whatever hashCode() implementation is decided on, it should probably mirror the way IDEs generate it when you ask them to. Specifically:</div><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><div>Project Lombok sticks to this plan, which is mostly derived from Effective Java, IIRC. Same goes for equals and toString.</div><div><br></div><div>--</div><div><br></div><div>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?</div><div><br></div><div>--</div><div><br></div><div>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.</div><div><br></div><div>--</div><div><br></div><div>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.</div><div><br></div><br><div apple-content-edited="true"><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div> --Reinier Zwitserloot</div><div><div><font class="Apple-style-span" face="arial" size="3"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px; white-space: pre-wrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></span></font></div></div></div></span></div></span><br class="Apple-interchange-newline"></div></body></html>