I am working with an API some of whose interfaces have a "close()" method but which do not implement AutoCloseable
(they predate this JDK addition), yet I would like to use them in a try-resources block. What to do?
Previously I would give up and just do the try
/finally
dance — Java has no perfect forwarding, implementing a wrapper class preserving the original's calls is terribly hard.
Java 8 provides a neat trick with method references:
interface Foo { void close(); void doFoo(); }
Elsewhere:
final Foo foo = new SomeFoo(); try (final AutoCloseable ignored = foo::close) { foo.doFoo(); }
Presto!
A practical use is pre-4 Spring Framework. When a context type in version 4 declares "close", it implements AutoCloseable
; version 3 and earlier do not.
Another neat trick here, the method names need not be the same:
interface Bar { void die(); void doBar(); }
And:
final Bar bar = new SomeBar(); try (final AutoCloseable ignored = bar::die) { bar.doBar(); }
No comments:
Post a Comment