如何防止Java为较新的SDK编译部分代码?

时间:2015-11-17 14:12:31

标签: java java-8 java-7

我想制作一个适用于Java 1.8和1.7的代码。具体来说,我想在接口中实现静态方法。这在java 8中是允许的,但在7中是不允许的。我读过有一种方法管C宏,也就是说这不是好习惯。另外,管道宏不告诉我使用哪个SDK?

所以有任何好的"解决这个问题?

更新

请不要建议实现抽象类。谢谢。

没有重复

Can Java 8 code be compiled to run on Java 7 jvm?询问是否有一种方法可以通过命令行来编译1.7中的java 1.8代码。至少答案看起来如此。我这样做的问题是,如果有一种方法可以在代码中指明哪些部分来自代码属于1.8,哪些部分属于1.7。

1 个答案:

答案 0 :(得分:2)

没有干净的Java方法可以做到这一点。有几种方法(也可以组合)来实现这一点。该解决方案的核心是一个小代码生成器,可以生成您需要的代码。您必须将构建系统配置为在调用javac之前调用生成器。

  1. 将代码放入不同的文件(页眉,页脚,Java 8代码),并在构建系统的准备步骤中创建最终的Java类(只需连接所需的部分)。对于Maven,那将是generate-sources。对于Ant,使用一组目标。
  2. 将代码放入同一文件中,并使用魔术注释指定代码的开始和结束位置。代码本身在第一列中注释掉了行注释:

    /*!!!JAVA8-START!!!*/
    //...Java 8 code...
    /*!!!JAVA8-END!!!*/
    

    如果您的构建系统检测到Java 8,它可以搜索两个注释之间以//开头的行,并删除//

  3. 如果您使用Maven,则可以使用三个模块。包含非Java 7/8特定代码的通用模块。一个用于Java 7的模块和一个用于Java的模块8.使用build profile启用特定模块。使用单元测试来确保Java 7和8模块中的代码是相同的(例如,通过删除Java 8特定部分并将其余部分与Java 7进行比较)。