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

如何防止Java为较新的SDK编译部分代码?,java,java-8,java-7,Java,Java 8,Java 7,我想编写一个适用于Java1.8和1.7的代码。具体来说,我想在接口中实现一个静态方法。这在Java8中是允许的,但在Java7中是不允许的。我读到有一个管道C宏的方法,也就是说这不是一个好的做法。此外,这些宏不会告诉我正在使用哪个SDK 那么有什么“好”的解决办法吗 更新: 请不要建议实现抽象类。谢谢 无重复项 询问是否有方法通过命令行在1.7中编译java 1.8的代码。至少答案看起来是这样。我的问题是,是否有一种方法可以在代码中指出代码中哪些部分属于1.8,哪些部分属于1.7。没有干净的J

我想编写一个适用于Java1.8和1.7的代码。具体来说,我想在接口中实现一个静态方法。这在Java8中是允许的,但在Java7中是不允许的。我读到有一个管道C宏的方法,也就是说这不是一个好的做法。此外,这些宏不会告诉我正在使用哪个SDK

那么有什么“好”的解决办法吗

更新

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

无重复项


询问是否有方法通过命令行在1.7中编译java 1.8的代码。至少答案看起来是这样。我的问题是,是否有一种方法可以在代码中指出代码中哪些部分属于1.8,哪些部分属于1.7。

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

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

    /*!!!JAVA8-START!!!*/
    //...Java 8 code...
    /*!!!JAVA8-END!!!*/
    
    如果构建系统检测到Java 8,它可以在两个注释之间搜索以
    /
    开头的行,并删除
    /

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

  • 你有这方面的例子和链接吗?不确定1、2、3是否为独立选项或步骤。但是,谢谢,你的答案看起来很有希望!看看开源JDBC驱动程序。他们经常有这个问题。但核心是,您需要编写一个简单的代码生成器,在调用Java编译器之前,您需要从构建系统调用它。人们甚至可能使用C预处理器。然后您将使用
    #ifdef
    来定义节,并且您需要在运行
    javac
    之前手动运行
    cpp
    。这可能会使编码变得困难,因为IDE和编辑器不会在代码中间预期这些指令。@ DSH您也忘了提及如何发现您在Javac 1.8或1.7中,这是问题的一部分。@ End.A27:该站点不提供罐头答案。我们总是只给出提示,除非我们有解决问题的代码(我们可以共享)。我估计要花几个小时才能想出一个完整的例子。我建议你决定走哪条路,使用哪种构建系统,然后问更具体的问题。如果你正在编写任何严肃的代码,那么唯一的答案就是“永远不要这样做,编写并使用1.7代码”。如果你决定这样做,那么只有肮脏的黑客是可能的,但他们都会包括可怕的脚本,削减和移动代码。任何像这样的尝试都会比仅仅吮吸和处理Java1.7更难让人痛苦,也会导致更多的头发撕裂?如果代码包含需要Java 8的部分,它无论如何也不会在Java 7下运行,特别是当它在
    接口中包含
    静态
    方法时,那么将它的其他部分标记为“属于Java 7”有什么意义呢?@Holger:试着编写一个JDBC驱动程序,它可以在5到8的任何Java版本中使用。由于接口一直在变化,因此需要某种形式的条件编程。在他的例子中,我猜他想提供一个库,可以在7和8中使用,在8中有一些附加功能,而不必保留两个代码基。@Holger:我想我们在这里有不同的优先级。我的目标是减少代码重复以降低维护成本。你的目标似乎是纯洁。我同意不可能干净地解决问题,但这并不意味着要求本身无效。