我有一个目前正在开发的库,它与JDK 6具有目标兼容性。我喜欢利用Java 8功能,比如lambdas。代码和API将从Java 8中获益匪浅。
我想为Java 6和Java 8提供库的版本,例如,某些部分仅在Java 8版本中可用。
现在有一些核心类可能有不同的源版本(旧的Java 6版本和新的Java 8版本)。
这样做的最佳做法是什么? 在Objective-C或C ++中,我会考虑使用预处理器指令。
答案 0 :(得分:2)
我看到了几个选项:
将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课程,即使是通过导入进行传递也是如此。这种方法的主要缺点是随着时间的推移跟踪那个小小的花絮。
我认为你所做的事情很有趣,而且我很想知道你是如何选择完成它的。请留意我们!
答案 1 :(得分:0)
我认为您可以使用系统属性(http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)来发现使用哪个Java版本,然后您可以调整应用程序以便相应地运行。