0

在 JavaScript 世界中,经常发生用户的浏览器没有实现某个功能,但可以通过添加一些额外的代码作为解决方法来支持它。这通常被称为“垫片”(或“shiv”)。#define ENABLE_XYZ_SUPPORT 1在 CI 中,在编译时使用类似then的预处理做了类似的事情#if ENABLE_XYZ_SUPPORT 1

Java中有这样的东西吗?也就是说,我希望能够用 Java 1.6 编译一些为 Java 1.7 设计的源代码。如果没有内置的语言结构,也许有一个库?

背景:我对 Java 有点陌生,并且正在开发我的第一个非常大的项目(基本上是一个有条件地组装来自各种来源的数据的 servlet)。由于这是一个全新的项目,利用 Java 1.7 的一些新特性(例如实现AutoCloseable对象接口而不是仅仅Closeable让它们可以与try-with-resources. 但是,如果这个应用程序可以构建为在 Java 1.6 上运行以备不时之需,那就太好了。如果我可以添加一个参数或其他东西来定义我自己的AutoCloseable接口,那么这可以编译,因为我实际上并没有使用try-with-resources——只是试图使用最合适的接口。

我意识到如果它是为 1.6 构建的,我可以做一些事情,比如让 maven 运行一个外部工具来用 Closeable 替换 AutoCloseable。但是,这并不是我真正想要的(不够笼统)。

更新:为了澄清,我想知道我是否可以在编译时有条件地做这样的事情:

#if java version < 1.7

    public interface AutoCloseable {
        void close() throws Exception;
    }

#endif

顺便说一句,我在这个项目中使用了 maven,所以如果它有一个对这里有帮助的功能,那可能值得考虑。

4

3 回答 3

2

您无法try-with-resources在 java 6 JVM 上运行使用 java 7 的新结构(例如 )的 java 代码,因此不幸的是,没有编译器或代码技巧可以帮助您。如果你想支持旧版本,你应该有两个代码库。

于 2013-06-07T16:57:18.620 回答
2

由于这是一个全新的项目,因此利用 Java 1.7 的一些新特性似乎是合理的,例如为对象实现 AutoCloseable 接口而不仅仅是 Closeable,以便它们可以与 try-with-resources 一起使用。但是,如果这个应用程序可以构建为在 Java 1.6 上运行以备不时之需,那就太好了。

这对 Java 来说是不行的——它向后兼容,但不向前兼容。如果您尝试破解 Java 6 中的各种 Java 7 语言功能(其中AutoCloseable一个),您最终会遇到一个可怕的项目混乱,这将导致比解决的问题更多的问题。

Java 7 支持现在相对广泛 - 不是有一段时间,但现在情况已经改变,所以我认为要求任何构建或运行应用程序的人都安装 Java 7 并不是不合理的。如果这是您必须拥有的东西,那么恐怕唯一明智的选择就是放弃 Java 7 语言功能并直接以 1.6 为目标。

于 2013-06-07T18:24:13.850 回答
2

如果你的 close 方法只抛出 IOExceptions,你可以实现 Closeable。这个接口是在 Java 1.5 中引入的。在 Java 7 中,它被修改为扩展 AutoCloseable。然后,您的库应该支持使用 Java 7 但仍与 Java 6 兼容的客户端的资源尝试。

我没有试过这个,但它似乎应该工作。

于 2013-06-07T20:54:40.080 回答