Many interfaces in GeoTools and GeoServer use the Dispose pattern, often with a dispose() method, but do not implement AutoCloseable, preventing their use in a try-with-resources statement. Examples range from ImageReader to DataStore/DataAccess. Some interfaces like FeatureReader already implement Closeable and thus AutoCloseable, but many do not.
Java 7 try-with-resources improves code quality because it simplifies code by automating common boilerplate:
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html
Adding AutoCloseable to an interface is an API-breaking change because third-party subclasses that do not implement a close() method will no longer compile. Any change would be applied only to master and would target GeoTools 20.0 and GeoServer 2.14.0.
- Should we add AutoCloseable to interfaces, and if so which ones? We could make a list.
- Do we make the change one interface at a time or try to do them all at once?
- Should we rename dispose() to close() in implementers and add a deprecated dispose() that wraps close(), or just add a close() that wraps dispose()?
- As we are breaking the API anyway, should we get rid of dispose() entirely by renaming it to close() without adding a deprecated wrapper?
- I thought of updating only interfaces and overrides. A more ambitious scope would find every deprecated dispose() and refactor to use try-with-resources. The alternative is to refactor incrementally over time. How do we wish to pay off our technical debt?
- Who is interested in participating in this work?
Kind regards,
--
Ben Caradoc-Davies <ben@anonymised.com>
Director
Transient Software Limited <https://transient.nz/>
New Zealand