如何创建一个使用AutoCloseable并且还支持Java 6的库

bmu*_*unk 6 java

我正在为Java开发人员创建一个库.我想创建一个实现AutoCloseable接口的类,以防开发人员使用Java 7.但是我还需要为没有AutoCloseable接口的类提供一个版本,面向Android的开发人员(不支持AutoCloseable).

在这两种情况下,我的班级名称必须相同.

一个解决方案是预处理器,但我的目标是开发人员,不能指望他们采用任何非标准的预处理器.

那么,根据Java版本支持同一类的两个版本的最佳实践是什么?

谢谢!

-更新澄清:
在完整的源代码,这两个版本的唯一区别是两个词"实现AutoCloseable":
公共类交易{...
或者
公共类交易实现AutoCloseable {...

Jen*_*der 2

  1. 制作 AutoCloseable 的向后移植

  2. 使用反向移植而不是真实的东西来制作你的库的第二个版本

  3. 要么通过将其实际发布为两个工件来让用户选择要使用的库,要么构建一个使用反射加载正确版本的公共外观。

对于向后移植:

AutoClosable 可以按原样重复使用。

对于每个实现,您都需要一个该接口的适配器。

try with resources 语句可能看起来有点像

abstract public class Try {
    private List<AutoClosable> closables = new ArrayList<>();

    public void register(AutoClosable closable){
        closables.add(closable); 
    }

    abstract void execute();

    public void do(){
        try{
            execute()
        } finally {
            for (AutoClosable c : closables)
                c.close() // there are tons of exceptionhandling missing here, and the order might need to get reversed ....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法看起来有点像:

new Try(){
    File f = new File();
    {
        register(closable(f)) // closabe would return an Adapter from File to AutoClosable
    }

    void execute(){
        f.doSomeFunStuff()
    }
}.do();
Run Code Online (Sandbox Code Playgroud)