RFR: 8072379: Implement jdk.Version and jdk.OracleVersion
joe darcy
joe.darcy at oracle.com
Wed Nov 25 21:31:49 UTC 2015
Hello,
On 11/25/2015 8:48 AM, Mandy Chung wrote:
>> On Nov 24, 2015, at 5:54 PM, Iris Clark <iris.clark at oracle.com> wrote:
>>
>> Hi.
>>
>> Please review the new classes jdk.Version and jdk.OracleVersion. These are
>> simple Java APIs to parse, validate, and compare version numbers.
>>
>> Webrev
>>
>> http://cr.openjdk.java.net/~irisa/verona/8072379/webrev.1/
> This looks good to me. Alan raises a good question whether jdk.OracleVersion is intended to be pushed to OpenJDK.
>
>
I share the concerns that have been raised about the naming and
placement of a class named "OracleVersion".
Is the intention that downstream JDK distributions, such as IcedTea,
whether based on OpenJDK or otherwise, would provide their own
specialization of the jdk.Version class?
If so, should there be some kind of provider interface to find system's
the version interpreter?
For example, what class, if any would be expected to provide detailed
analysis of the version string emitted by, say, a OpenJDK build used as
the reference implementation of Java SE 9?
The equals / hashCode behavior of Version and OracleVersion is bit
surprising and I think somewhat underspecified given the possibility of
defining subclasses.
The (overridable) equals method in Version says "Two Versions are equal
if and only if they represent the same version string." If that is
interpreted to mean the Versions are equal if their toString output is
equal, the toString spec says "Returns a string representation of this
version." and the (overridable) implementation in Version looks at
versions, pre, build, and optional.
Since OracleVersion does not override equals, a plain Version object and
an OracleVersion object can compare as equal. Additionally, a
VersionWithDifferentToStringOutput("1.2.3") object which overrides
toString would not be semantically equivalent to a Version("1.2.3")
object. Worse, there could be a non-communicability behavior in the
equals method since
(new Version("1.2.3")).equals(new
VersionWithDifferentToStringOutput("1.2.3"))
could return "true" while
(new VersionWithDifferentToStringOutput("1.2.3")).equals(new
Version("1.2.3"))
could easily and legitimately return "false" by the specification.
How is this API supposed to behave if the component version strings have
a numerical value greater than Integer.MAX_VALUE?
Was using Longs to record numerical versions rather than Integers
considered?
Thanks,
-Joe
More information about the core-libs-dev
mailing list