1

我有一个库,我目前正在开发目标与 JDK 6 的兼容性。我喜欢利用 Java 8 的特性,比如 lambdas。代码和 API 将极大地受益于 Java 8。

我想提供 Java 6 和 Java 8 的库版本,例如,某些部分仅在 Java 8 版本中可用。

现在有一些核心类可能有不同的源版本(旧的 Java 6 版本和新的 Java 8 版本)。

这样做的最佳做法是什么?在 Objective-C 或 C++ 中,我会考虑使用预处理器指令。

4

2 回答 2

2

我看到了几个选项:

  1. 打包不同版本的库,一个用于 JDK6,一个用于 JDK8。用户有责任为其应用程序添加正确的内容。这将是一个有趣的构建。如果您使用的是 Maven,我认为您将只使用 3 个项目;一个包含所有公共类的“commons”项目,一个将 commons 项目作为依赖项并构建 JDK6 jar 的“JDK6”项目,然后是一个将 commons 项目作为依赖项并构建 JDK8 jar 的“JDK8”项目。这种方法的一个吸引人的地方是它显然可以工作,而且您无需进行硬维护。
  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 类,即使是通过导入传递。这种方法的主要缺点是随着时间的推移跟踪这个小花絮。

我认为你正在做的事情很有趣,我很想知道你选择如何完成它。请随时通知我们!

于 2013-06-22T16:11:32.447 回答
0

我认为您可以使用系统属性(http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)来发现正在使用的 Java 版本,然后您可以调整您的应用程序以运行因此。

于 2013-06-22T15:50:14.890 回答