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

标签 java java-8 java-7

我想编写适用于 Java 1.8 和 1.7 的代码。具体来说,我想在接口(interface)中实现一个静态方法。这在 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。

最佳答案

没有干净的 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 特定代码的公共(public)模块。一个用于 Java 7 的模块,一个用于 Java 8 的模块。使用 build profile 启用特定模块。 。使用单元测试确保 Java 7 和 8 模块中的代码相同(例如,删除 Java 8 特定部分并将其余部分与 Java 7 进行比较)。

关于java - 如何防止Java为较新的SDK编译部分代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33759086/

相关文章:

java - 新浏览器选项卡打开,在 SELENIUM WEBDRIVER JAVA 后找不到 WebELements

java - 如何在 Java 中的 Windows 和 IANA 时区之间进行转换

java - 我的类加载器出了什么问题?转换为同一个类时出现 ClassCastException!

java - 为什么 Kotlin sortBy() 似乎以相反的顺序运行?

java - 如何读取java中另一个类中定义的类的arraylist元素?

java - 在 Java 8 中的 Map<String, List> 中向 List 添加值

java - 为什么泛型类型参数上的注释对于嵌套类型不可见?

java - 为什么在 try with resources 子句中实例化时出现错误?

java - 在Java 7中,如何创建一个现实生活中的示例来演示Files.exists和Files.notExists之间的区别?

java - 如何避免应用程序在网络中使用IP访问?