我有一个库,我目前正在开发目标与 JDK 6 的兼容性。我喜欢利用 Java 8 的特性,比如 lambdas。代码和 API 将极大地受益于 Java 8。
我想提供 Java 6 和 Java 8 的库版本,例如,某些部分仅在 Java 8 版本中可用。
现在有一些核心类可能有不同的源版本(旧的 Java 6 版本和新的 Java 8 版本)。
这样做的最佳做法是什么?在 Objective-C 或 C++ 中,我会考虑使用预处理器指令。
我有一个库,我目前正在开发目标与 JDK 6 的兼容性。我喜欢利用 Java 8 的特性,比如 lambdas。代码和 API 将极大地受益于 Java 8。
我想提供 Java 6 和 Java 8 的库版本,例如,某些部分仅在 Java 8 版本中可用。
现在有一些核心类可能有不同的源版本(旧的 Java 6 版本和新的 Java 8 版本)。
这样做的最佳做法是什么?在 Objective-C 或 C++ 中,我会考虑使用预处理器指令。
我看到了几个选项:
将 JDK6 和 JDK8 版本打包在同一个 JAR 中,并创建一个“运行时”类型的类,该类负责根据运行的 JDK 在运行时创建库对象的正确版本。例如:
public abstract class Runtime {
private static Runtime instance;
public static Runtime getInstance() {
if(instance == null) {
try {
if(System.getProperty("java.version").startsWith("8"))
instance = Class.forName("com.yourcompany.libname.runtime.Runtime8").newInstance();
else
instance = Class.forName("com.yourcompany.libname.runtime.Runtime6").newInstance();
}
catch(Exception e) {
throw new RuntimeException("Could not create runtime", e);
}
}
return instance;
}
public abstract Framework getFramework();
}
使用这种方法,您只需要使用反射来加载初始的“运行时”对象,然后您就可以使用本机 Java 来处理其他所有内容。例如:
Framework framework=Runtime.getInstance().getFramework();
ModelObject1 m=framework.newModelObject1();
// ...
只要确保你的Runtime6
类没有引用 JDK8 类,即使是通过导入传递。这种方法的主要缺点是随着时间的推移跟踪这个小花絮。
我认为你正在做的事情很有趣,我很想知道你选择如何完成它。请随时通知我们!
我认为您可以使用系统属性(http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)来发现正在使用的 Java 版本,然后您可以调整您的应用程序以运行因此。