6

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

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

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

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

谢谢!

-- 更新澄清:
两个版本的完整源代码的唯一区别是“实现 AutoCloseable”这两个词:
public class Transaction { ...

public class Transaction implements AutoCloseable {...

4

2 回答 2

2
  1. 制作 AutoCloseable 的反向移植

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

  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 ....
        }
    }
}

用法看起来有点像:

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

    void execute(){
        f.doSomeFunStuff()
    }
}.do();
于 2012-11-23T09:27:28.987 回答
1

您需要两个版本的库,但如果您只想拥有一个源代码,请查看 AspectJ ,它会在编译后修改字节码。那样的话,您可以使用一个 sozrce 代码获得两个库,但是两个构建目标具有不同的 AspectJ 选项。

于 2012-11-23T09:52:50.910 回答