Thanks for continuing to look at this with Brian

I also had this response on twitter - "my most hated Java bug, top 1"
https://twitter.com/temerev/status/300204751931453440

Stephen

On 15 February 2013 05:54, Joe Darcy <joe.da...@oracle.com> wrote:
> On 02/08/2013 02:37 PM, Stephen Colebourne wrote:
>>
>> We've established that it causes problems (me and Paul) and that likely
>> workarounds of the bug would not be broken by a fix.
>
>
> The adaptation you and Paul have for the current behavior would not be
> impacted by a change in the behavior of stringTrailingZeros. That just
> leaves all the other Java programmers to check with ;-)
>
> Since any angry emails on changing the behavior would come the way of Brian
> and I (probably in a few years time), Brian has agreed to do some additional
> research on how stripTrailingZeros is used in existing code to gauge what
> impact there could be to altering the long-standing behavior. If the impact
> is small, we can make the change in JDK 8.
>
> -Joe
>
>
>
>>
>> The getMethods case is very different as the spec clearly allowed the
>> behavior. Here the spec and method name are also clear on the expected
>> behavior. The proposal would make the behavior out of line with the method
>> name and of no earthly use to users. ie, as a user of that method, I would
>> never be calling it for any reason other than to remove all the trailing
>> zeroes.
>>
>> Mostly the JDK team gets it right. But not this time.
>>
>> Stephen
>>
>>> On 8 Feb 2013 20:32, "Joe Darcy" <joe.da...@oracle.com> wrote:
>>>>
>>>> Hello,
>>>>
>>>> On 2/6/2013 11:32 PM, Bruce Chapman wrote:
>>>>>
>>>>> Stephen, In your case(s) would the workaround fail to work if the bug
>>
>> was fixed?
>>>>>
>>>>> Working around a bug is quite different to taking advantage of the
>>
>> buggy behaviour.  If fixing the bug would break code that works around it
>> that can be seen as a problem, while breaking code that relies on the bug
>> is IMHO much less of an issue since anyone that does that is taking a
>> known
>> risk, or a risk that should reasonably be expected to be known.
>>>>>
>>>>> I am finding it hard to imagine a genuine attempt at a workaround that
>>
>> would not still work (though redundantly) if the bug was fixed.
>>>>>
>>>>> Also bear in mind that there are other implementations, and the
>>
>> signature and the javadoc are the spec. If you find behaviour that differs
>> and take advantage of that behaviour then you are opening the possibility
>> of it changing if either: you run with another implementation, or the bug
>> gets fixed.
>>>>>
>>>>> While it is easy to contrive an example that would break if this bug
>>
>> were fixed, and it is possible (on the grounds that I cannot prove it is
>> impossible) that some real code might break, it is hard to imagine a
>> scenario where the author/owner of that broken code has any morally
>> legitimate grounds for complaint in that case.
>>>>>
>>>>> I guess if you take the "This is one of those unfortunate cases where a
>>
>> bug can become a feature." approach to its logical conclusion then no bugs
>> get fixed because there are no bugs, just a nice online list of newly
>> discovered unexpected features.
>>>>
>>>>
>>>> As noted earlier in this thread, we use a nuanced compatibility policy
>>
>> in evolving the JDK:
>>>>
>>>>
>>
>> http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html
>>>>
>>>> In particular, besides looking after source and binary compatibility, we
>>
>> also look to manage behavioral compatibility, that is, to be mindful of
>> changing what a method does at runtime when called, even when the
>> specification gives us leeway to do so.
>>>>
>>>> Let me relate an example of behavioral compatibility from JDK 7. The
>>
>> method Class.getMethods returns an array of Method objects for the Class
>> and in part its javadoc has long stated:
>>>>
>>>>      "The elements in the array returned are not sorted and are not in
>>
>> any particular order."
>>>>
>>>> Therefore, any caller of Class.getMethods relying on or assuming a
>>
>> particular order has a bug according to the specification.  As a
>> side-effect of permgen removal in JDK 7, the long-standing (and mostly
>> stable) order of Method objects returned by HotSpot changed. As expected,
>> some user applications and tests "broke" after this change went in.  We
>> received requests to "fix" the ordering of Class.getMethods, which we
>> declined to do given the benefits of permgen removal and the clear
>> specification that no ordering should be relied upon.  Even though that
>> change in getMethods is allowed by specification, it is out-of-bounds of
>> what we would do an an update release but in-bounds for a platform release
>> like JDK 7.
>>>>
>>>> The reason for this conservatism is because we value keeping the broad
>>
>> usage of the JDK working :-)
>>>>
>>>> Getting back to BigDecimal.stripTrailingZeros, we cannot inspect all
>>
>> usages of this method today, nor can we inspect all the future usages of
>> BigDecimal.stripTrailingZeros that will be around before JDK 8 is adopted
>> for the code in question. We know not everyone migrates to a new JDK
>> release promptly; within the past two years I fielded a query/complaint
>> about the behavior change in BigDecimal.toString made between 1.4.2 and
>> JDK
>> 5 and later.
>>>>
>>>> For these sorts of reasons, the default resolution when the
>>
>> specification and implementation conflict is to make the specification
>> match the implementation.  There are exceptions to this default. Given
>> sufficient evidence that changing the behavior of
>> BigDecimal.stripTrailingZeros would not have adverse consequences on
>> fielded code, we could change its behavior despite being implemented that
>> way for about 9 years.
>>>>
>>>> -Joe
>>>>
>>>>> Bruce
>>>>>
>>>>> On 7/02/2013 12:16 p.m., Stephen Colebourne wrote:
>>>>>>
>>>>>> On 5 February 2013 09:09, Paul Sandoz <paul.san...@oracle.com> wrote:
>>>>>>>
>>>>>>> This is one of those unfortunate cases where a bug can become a
>>
>> feature.
>>>>>>
>>>>>> I *really* don't see how.
>>>>>>
>>>>>> The method name is absolutely clear about its purpose. "Strip trailing
>>>>>> zeros". Anyone relying on it not stripping zeroes for zero needs their
>>>>>> head examining.
>>>>>>
>>>>>> This particular one just happens to be one that I've run across twice
>>>>>> and in both cases it required a workaround. I'd argue that there are
>>>>>> more people with undiscovered bugs in their code because the method is
>>>>>> buggy than people who would break were the method fixed.
>>>>>>
>>>>>> What bothers me even more is the desire expressed in this thread to
>>>>>> simply wish away bugs by redefining the documentation. If the method
>>>>>> name is clear enough, like in this case, then its a bug, and a
>>>>>> documentation change simply isn't the right solution.
>>>>>> Stephen
>>>>>>
>

Reply via email to