1. ホーム
  2. java

[解決済み] Java の条件付きコンパイル:コードチャンクをコンパイルしないようにするには?

2022-02-24 05:51:49

質問

私のプロジェクトでは、コンパイルと実行にJava 1.6が必要です。現在、私はそれをJava 1.5で動作させるための要件を持っています(マーケティング側から)。私は、エラーなしでJava 1.5でコンパイルするために、メソッド本体(戻り値の型と引数は同じまま)を置き換えたいと思っています。

詳細 というユーティリティクラスを持っています。 OS これはOSに特有のものをすべてカプセル化するものです。このメソッドには

public static void openFile(java.io.File file) throws java.io.IOException {
  // open the file using java.awt.Desktop
  ...
}

を使えば、ダブルクリックのようにファイルを開くことができます ( start Windowsのコマンドまたは open Mac OS Xのコマンドに相当)。このメソッドはJava 1.5でコンパイルできないので、コンパイル時に除外し、別のメソッドで run32dll Windowsの場合、または open を使用してMac OS Xで使用します。 Runtime.exec .

質問です。どうすればいいのでしょうか?アノテーションはここで役に立ちますか?

注:私はantを使用しており、2つのjavaファイルを作成することができます。 OS4J5.javaOS4J6.java を含むことになります。 OS クラスに、Java 1.5と1.6に必要なコードをコピーし、そのうちの1つを OS.java の内容をコンパイル前に置き換える(あるいは、醜い方法ですが。 OS.java しかし、私はそれをしたくない、もし他の方法があるならば。

さらに詳しく説明すると、C言語では ifdef, ifndef Python ではコンパイルが不要で、ある機能をチェックするには hasattr などがありますが、Common Lispでは #+feature . Javaでも同じようなものがあるのでしょうか?

発見 この記事 が、参考にならないようです。

どんな助けでも大歓迎です。

解決方法を教えてください。

Javaでは条件付きコンパイルはサポートされていないんだ。

通常、アプリの OS 固有の部分を Interface を使用し、実行時にOSの種類を検出し実装をロードします。 Class.forName(String) .

あなたの場合、この2つをコンパイルできない理由はないでしょう。 OS* (そしてアプリ全体も)Java 1.6で -source 1.5 -target 1.5 を取得するためのファクトリーメソッドで OS クラス(これは今やインターフェイスであろう)が java.awt.Desktop クラスが利用可能であれば、正しいバージョンをロードします。

のようなものです。

 public interface OS {
     void openFile(java.io.File file) throws java.io.IOException;
 }

 public class OSFactory {
     public static OS create(){
         try{
             Class.forName("java.awt.Desktop");
             return new OSJ6();
         }catch(Exception e){
             //fall back
             return new OSJ5();
         }
     }
 }