Proposed refactoring: introduce JLS7 language features to core libs
Stuart Marks
stuart.marks at oracle.com
Tue May 1 01:52:54 UTC 2012
On 4/25/12 12:07 PM, Stefan Reich wrote:
> Hello,
>
> is there any interest to accept change sets based on OpenJDK 7 that update the java classes in jdk/src/share/classes to use
>
> * multi-catch
> * string switch statements as opposed to nested if statements when comparing strings with string literals
> * type inference by removing duplicative type information in the constructor when using generics
> * indexOf(int) when indexOf(String) is used with a String literal that contains only one character, and similar small-scale improvements?
>
> The proposed change sets would pass all jtreg tests. If there is interest, what would be next steps?
Hi, yes, there is interest! Thanks for raising this topic.
In some respects this seems similar to the "Coinification" work [1] I did
during JDK7 development, that is, to use the then-new Project Coin features in
the code base of the JDK itself. The goal of that effort was to put some of the
Coin features to use in production code, so as to gain experience with them,
but not necessarily to "coinify" the entire source base. In fact I've been
asked how much of the code base was converted to use the new features. The
answer is, I don't know. I'm pretty sure that there is a lot remaining to be
done, though.
(As an aside, most of the warnings work we've been doing over the past several
months is to clean warnings that result from the use of raw types instead of
generics. That is, there is lots of code lying around that hasn't been updated
to Java 5 generics yet! There are similar refactorings one could apply for Java
5 language features, such as the enhanced-for loop, enums, covariant overrides,
autoboxing, etc.)
Probably the easiest feature to get started with is diamond (formally known as
"type inference for generic instance creation"). It should be fairly simple to
find lots of examples where this can be put to use, now that there are bulk
change hints available in NetBeans. (Bulk changes are probably also available
in Eclipse and IntelliJ Idea.) The good thing about diamond is that it is
practically impossible to bugs when doing diamond conversion. In fact, the
resulting class files should be byte-for-byte identical to the previous
versions. In practice, though, I did join lines where appropriate, since using
diamond often shortened the code enough to fit on a single line where it had to
be split across lines before.
There are a small number of stylistic issues that occur when using diamond; see
[2] and [3]. Different people have different styles, and unfortunately
different styles have emerged in different areas of code. The main difference
seems to be whether diamond is used in assignment and return statements, where
the use of diamond is separated from the variable declaration that contains the
complete type.
In practice what this means is that you should break down your changesets to
apply to different functional areas, and then find the right people and the
right mailing list to discuss the changes beforehand. (Actually this is
probably good practice for any change, not just diamond.)
Turning to the other suggestions, I'd say that multi-catch and
strings-in-switch are also fairly safe refactorings to propose, although they
probably occur much less frequently than diamond. There are some subtleties
with applying these refactorings, which will require more scrutiny than
applying diamond changes.
For example, in some cases there is a catch of Exception that is better
expressed as a multi-catch of several Exception subtypes. This might make for
better code, but it subtly changes the behavior of the code. For
strings-in-switch, a null value of the switch expression results in NPE,
whereas (depending on the details, of course) a cascade of if-elses may end up
handling null differently.
I'm not sure about the indexOf() cases you refer to. I guess I'd have to see
some examples before deciding whether these are worthwhile to pursue.
In any case, thanks for taking the initiative to work on this stuff. Looking
forward to seeing what you come up with.
s'marks
[1]
http://stuartmarks.wordpress.com/2010/12/23/jdk7-coin-and-making-libraries-fresh-and-minty/
[2] http://stuartmarks.wordpress.com/2011/01/24/where-can-diamond-be-used/
[3] http://stuartmarks.wordpress.com/2011/04/29/when-should-diamond-be-used/
More information about the core-libs-dev
mailing list