0

JavaScript の世界では、ユーザーのブラウザーが機能を実装していないことがよくありますが、回避策として追加のコードを追加することでサポートできます。これはしばしば「shim」(または「shiv」) と呼ばれます。#define ENABLE_XYZ_SUPPORT 1CI では、 と thenのような前処理を使用して、コンパイル時に同様のことを行いまし#if ENABLE_XYZ_SUPPORT 1た。

Javaにこのようなものはありますか?つまり、Java 1.7 用に設計されたソース コードを Java 1.6 でコンパイルできるようにしたいと考えています。組み込みの言語構造がない場合、おそらくこれのためのライブラリがありますか?

背景:私は Java の初心者で、最初の非常に大規模なプロジェクト (基本的には、さまざまなソースから条件付きでデータを組み立てるサーブレット) を開発しています。これはまったく新しいプロジェクトであるため、Java 1.7 の新機能のいくつかを利用することは理にかなっているように思われましたAutoCloseable。たとえばCloseabletry-with-resources. ただし、必要な場合に備えて、このアプリケーションを Java 1.6 でも実行できるようにビルドできると便利です。パラメータまたは何かを追加して独自のAutoCloseableインターフェイスを定義できるようにすると、実際には使用していないため、これはコンパイルできますtry-with-resources-最も適切なインターフェイスを使用しようとしているだけです。

1.6用にビルドしている場合、外部ツールを実行してAutoCloseableをCloseableに置き換えるようなことができることに気づきました。ただし、それは私が探しているものではありません (十分に一般的ではありません)。

更新:明確にするために、次のようにコンパイル時に条件付きで何かできるかどうか疑問に思っています:

#if java version < 1.7

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

#endif

ところで、私はこのプロジェクトでmavenを使用しているので、ここで役立つ機能があれば検討する価値があります。

4

3 に答える 3

2

Java 7 の新しい構造 ( などtry-with-resources) を使用する Java コードを Java 6 JVM で実行することはできないため、残念ながら、これに役立つコンパイラやコード トリックはありません。古いバージョンをサポートする場合は、2 つのコードベースが必要です。

于 2013-06-07T16:57:18.620 に答える
2

これはまったく新しいプロジェクトであるため、オブジェクトを try-with-resources で使用できるようにするために、単なる Closeable ではなく AutoCloseable インターフェイスをオブジェクトに実装するなど、Java 1.7 の新機能のいくつかを利用するのが合理的であるように思われました。ただし、必要な場合に備えて、このアプリケーションを Java 1.6 でも実行できるようにビルドできると便利です。

これは Java には当てはまりません。後方互換性はありますが、前方互換性はありません。Java 6 でさまざまな Java 7 言語機能 (そのうちのAutoCloseable1 つ) を取得する方法をハックしようとすると、解決したよりも多くの問題を引き起こすプロジェクトの恐ろしい混乱に終わるでしょう。

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 に答える