我正在为Java开发人员创建一个库.我想创建一个实现AutoCloseable接口的类,以防开发人员使用Java 7.但是我还需要为没有AutoCloseable接口的类提供一个版本,面向Android的开发人员(不支持AutoCloseable).
在这两种情况下,我的班级名称必须相同.
一个解决方案是预处理器,但我的目标是开发人员,不能指望他们采用任何非标准的预处理器.
那么,根据Java版本支持同一类的两个版本的最佳实践是什么?
谢谢!
-更新澄清:
在完整的源代码,这两个版本的唯一区别是两个词"实现AutoCloseable":
公共类交易{...
或者
公共类交易实现AutoCloseable {...
制作 AutoCloseable 的向后移植
使用反向移植而不是真实的东西来制作你的库的第二个版本
要么通过将其实际发布为两个工件来让用户选择要使用的库,要么构建一个使用反射加载正确版本的公共外观。
对于向后移植:
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)