我有一个必须在java4和java5中支持的应用程序。如果是java 5执行环境,我想添加更多功能。
public class Test
{
private ScheduledExecutorService scheduler;
private ScheduledFuture<?> scheduledFuture;
private boolean java4ExecEnv;
public Test()
{
in the manifest.mf file I have something like Bundle-RequiredExecutionEnvironment, using this i am setting java4ExecEnv
java4ExecEnv = true/false;
}
method1()
{
if(!java4ExecEnv)
scheduledFuture = scheduler....
}
method2()
{
if(!java4ExecEnv)
scheduledFuture....
}
}
在method1和method2中,如果它是java4版本,我可以避免调用scheduler和scheduledFuture。但是,如果执行环境是java4,有没有办法避免实例变量声明(scheduler,scheduledFuture)。
或者我应该寻找java4和5中支持的替代方案。
答案 0 :(得分:0)
如果是java 5执行环境,我想添加更多功能
Java 5和Java 1.4具有不同的API。虽然大多数都有相似之处,但如果您计划定位特定版本,则必须在编译时完成,而不是在代码本身中完成。您可以使用System.getProperty
来获取版本,但Java不像带有条件#define
的C / C ++。因此,如果代码是在更高的JRE上编译的,那么它就不会在较低的JRE上运行。
答案 1 :(得分:0)
以下是一些将在Java 1.4和Java 5上运行的演示代码:
import java.util.concurrent.*;
public class Demo implements Runnable {
public void run() { System.out.println("Executing"); }
public static interface Runner { void run(Runnable r); }
private static class Runner4 implements Runner {
public void run(Runnable r) {
System.out.println("Java 1.4");
new Thread(r).start();
}
}
private static class Runner5 implements Runner {
ExecutorService executor = Executors.newCachedThreadPool();
public void run(Runnable r) {
System.out.println("Java 5");
executor.submit(r);
}
}
public static Runner loadRunner() {
try {
Demo.class.forName("java.util.concurrent.ExecutorService");
return new Runner5();
} catch (ClassNotFoundException e) {
return new Runner4();
}
}
public static void main(String[] args) { loadRunner().run(new Demo()); }
}
此代码必须使用Java 5或更高版本编译,版本为target 1.4。它检查 ExecutorService 类型的类路径,如果不存在则返回替代方案。
如果这是一个非常重要的项目,我会将Java 5依赖代码转换为某种可选插件,并针对Java 1.4运行时库编译大量代码。