Project Coin: Bringing it to a Close(able)
By darcy on Jul 06, 2010
As a follow-up to the initial API changes to support automatic resource management (ARM) I wrote an annotation processor,
CloseableFinder, to programmatically look for types that were candidates to be retrofitted as
The processor issues a note for a type that has a
public no-args instance method returning
void whose name is "
close" where the type does not already implement/extend
AutoCloseable. Based on the exceptions a
close method is declared to throw, the processor outputs whether the type is a candidate to be retrofitting to just
AutoCloseable or to either of
AutoCloseable. Which of
AutoCloseable is more appropriate can depend on the semantics of the
close method not captured in its signature. For example,
Closeable.close is defined to be idempotent, repeated calls to
close have no effect. If a
close method is defined to not be idempotent, without changing the specification the type can only be correctly retrofitted to
To use the processor, first compile it and then configure your compiler or IDE to run the processor.
The processor can be compiled under JDK 6. Once compiled, it can be run either under JDK 6 or under a JDK 7 build that has the
AutoCloseable interface; the processor will configure itself appropriately based on the JDK version it is running under.
javac, the command line to run the processor can look like:
javac -proc:only \\
-processor CloseableFinder \\
-processorpath Path_to_processor \\
A thread on
build-dev discusses how to run an annotation processor over the JDK sources; a larger than default heap size may be needed to process all the files in one command.
When run over the JDK 7 sources, the processor finds many candidate types to be retrofitted. After consulting with the teams in question, an additional nine types were retrofitted to work with ARM, two in
java.beans, two in
java.io, one in
java.util, and four in
javax.sound; these additional retrofittings have been pushed into JDK 7 and will appear in subsequent builds.
Besides the potential updating of JDBC at some point in the future, other significant retrofitting of JDK classes in
Closeable should not be expected. Unofficial JDK APIs in other namespaces might be examined for retrofitting in the future.
The compiler changes to support the ARM language feature remain in progress.