Value type hash code (original) (raw)
David Simms david.simms at oracle.com
Thu Apr 19 08:04:42 UTC 2018
- Previous message (by thread): Value type hash code
- Next message (by thread): Value type hash code
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Summary of points raised:
- Implementation specification: besides the general contract [1], implementation doesn't need to be specified o this has advantages to JDK and JVM developers to enable change, protects users from said future changes
- Default implementation o Javac could provide the default implementation + bloats class file forever o BSM mechanism described by John enables more flexibility, efficiency and better optimization opportunities + e.g. BSM may read annotations at lookup time, allowing users to decoratively specify which fields and which method for handling references + may have bootstrapping issues, if so, said JDK classes need to implement hashCode themselves o Even if the JVM doesn't implement it directly, it shouldn't crash or behave erratically + JVM: Return 0, -1, 4711, or throw exception (doesn't matter given the point above, 0 for argument's sake) ?
- On the topic of calling reference fields, calling "hashCode()" or using "System.identityHashCode()" o "System.identityHashCode()" is consistent with "Arrays.hashCode(Object[])" [2] + Almost meaningless to the user, many think it is a mistake o Calling "hashCode()" is consistent with "List.hashCode(Object[])" [3] + may result in recursion or costly traversal # This is fine, user needs to decide what to do by supplying their own... o BSM method can help user to declare what they prefer
Obviously a similar discussion can be had for "equals()", except this issue doesn't really involve the JVM (as hashCode does).
Clearly being able to declaratively control hash/equals deep vs identity is very powerful...we'll be prototyping looking for further technical issues.
Feel free to call shenanigans if I have something wrong. Agreeing to disagree is also an option, and nothing is set in stone, still prototyping.
Thanks for all the feedback !
/David Simms
[1] https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#hashCode() [2] https://docs.oracle.com/javase/10/docs/api/java/util/Arrays.html#hashCode(java.lang.Object%5B%5D) [3] https://docs.oracle.com/javase/10/docs/api/java/util/List.html#hashCode()
- Previous message (by thread): Value type hash code
- Next message (by thread): Value type hash code
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]