Test for JDK-5108778 Too many instances of java.lang.Boolean created in Java application

Stuart Marks stuart.marks at oracle.com
Wed Oct 7 00:01:11 UTC 2015



On 10/6/15 3:24 AM, Stephen Colebourne wrote:
> Moving to core-libs:
>
> On 3 October 2015 at 03:20, Stuart Marks <stuart.marks at oracle.com> wrote:
>> An interesting exercise would be to add the @Deprecated annotation to the
>> Boolean constructor and build the JDK and see how many warnings result. That
>> might be a quick way to find the code that needs to be fixed.
>
> I'd really like to see this. Specifically, adding @Deprecated to _all_
> constructors on Boolean, Short, Integer, Long, Character, Float,
> Double. This may require some additional factory methods to be added.
>
> Doing this for Java 9 would be good preparation for value types. While
> the Valhalla team are not currently talking about converting these
> classes to values, they are clearly very value-like. Pushing users to
> treat them more as values seems like a Good Thing. It might even tip
> the balance towards making them actual value types.

Hi Stephen,

Interesting. There are a few issues at play here; let me try to separate them.

In my message above, I merely suggested that Sebastian add @Deprecated to the 
Boolean constructors in his source tree as a means of static analysis. This is a 
quick way to derive a set of targets for cleaning up.

That said, it's worth considering changing the Java SE API to deprecate Boolean 
and possibly other box constructors. As things stand today, though, the 
situation with deprecation is quite confusing. It's not clear whether 
deprecating something means that it will eventually be removed. When something 
becomes deprecated, people's responses are all over the map. It's either "ignore 
it, they've never removed anything from the JDK" or "they can't remove that, it 
will cause massive breakage!!" So the notion of deprecation will have to be 
clarified first.

I'm working on a draft JEP (not yet public) for this, but some early thoughts 
along these lines were presented by my alter ego Dr Deprecator at JavaOne last 
year.[1] Basically, you'd want some marking that doesn't mean that the API will 
be removed, but that will issue a warning to developers suggesting they use a 
different API instead.

I think it's pretty clear that we should "deprecate" in some fashion the Boolean 
and Byte constructors, since boxes for all possible values of these types are 
cached and reused.

The case for deprecating other box constructors is less clear in my mind. For 
example, Double.valueOf(d) always calls new Double(d); no Double boxes are 
cached. One could imagine caching specific boxes such as zero, but there are 
very few such values that would make sense to cache. The benefit of telling 
programmers to convert new Double(d) to Double.valueOf(d) thus seems quite small 
to me.

Then again, in a value-typed future, there might be some advantages to doing 
this that I'm not aware of. Some time ago Brian Goetz was quite skeptical that 
the primitive boxes could ever become true value types. But things might have 
changed, so I'll avoid forming a strong opinion on this issue until we hear more 
about how value types might impact this issue.

s'marks



[1] https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=6377



More information about the core-libs-dev mailing list