20

私は長年の C++ プログラマーで、Java は初めてです。Eclipse で Java Blackberry プロジェクトを開発しています。質問 - プロジェクト内に異なる構成セットを導入し、それらに基づいてわずかに異なるコードをコンパイルする方法はありますか?

Visual Studio には、プロジェクト構成と #ifdef; があります。Javaには#ifdefがないことは知っていますが、ファイルレベルで何かあるのでしょうか?

4

11 に答える 11

17

「final」フィールドと ifs を設定して、コンパイルされたバイトコードをコンパイラに最適化させることができます。

...
public static final boolean myFinalVar=false;
...
if (myFinalVar) { 
 do something ....
 ....
}

コードのコンパイル時に「myFinalVar」が false の場合、「do something....」ビットはコンパイルされたクラスから失われます。複数の条件がある場合 - これは少し整理できます: それらをすべて別のクラス (「Config.myFinalVar」など) にシフトすると、条件をすべて 1 つのきちんとした場所に保持できます。

このメカニズムについては、「Hardcore Java」で説明されています。

【実はこれは先ほど投稿した「貧乏人のifdef」と同じ仕組みだと思います。】

于 2009-12-17T15:44:27.583 に答える
6

これを BlackBerry 専用にしたい場合、BlackBerry JDE にはプリプロセッサがあります

Eclipse™ 構成ファイルを更新することにより、アプリケーションの前処理を有効にすることができます。

C:\Program Files\Eclipse\configuration\config.ini で、次の行を追加します。 osgi.framework.extensions=net.rim.eide.preprocessing.hook ビルド後に前処理を有効にする場合は、プロジェクトを再度ビルドする前に、[プロジェクト] メニューからプロジェクトを削除します。

次に、コードで次のようなことができます。

//#ifdef SOMETHING
// do something here
//#else
// do something else
//#endif

詳しくは、プリプロセッサー定義の指定を参照してください。

于 2009-12-18T17:30:59.857 に答える
6

たとえば、一連の個別のディレクトリに各「アクション」を実装するなど、さまざまなクラスパスを管理できます。

dir1/Main.java
dir2/Action.java
dir3/Action.java

次に、バージョンごとに異なるクラスパスを使用します

javac -sourcepath dir1 -cp dir2 dir1/Main.java

また

javac -sourcepath dir1 -cp dir3 dir1/Main.java
于 2009-12-17T15:45:13.953 に答える
4

それを貧乏人と呼ぶことができますかifdef: http://www.javapractices.com/topic/TopicAction.do?Id=64 ?

于 2009-12-17T15:35:08.057 に答える
3

いいえ、Javaはその機能に完全に一致するものはありません。アスペクトを使用することも、IOCコンテナーを使用してさまざまな実装クラスを挿入することもできます。

于 2009-12-17T15:32:22.513 に答える
1

Maven、Ant、および同様の機能を提供するその他のビルド ツールに加えて、Java でインターフェイスを構築し、実行時に実装を切り替えることをお勧めします。
詳細については、戦略パターンを参照してください

Java の JIT コンパイラは実行時に最適化し、ほとんどの場合、このパターンをインライン化できるため、C/C++ とは対照的に、パフォーマンスが大幅に低下することはありません。
このパターンの大きな長所は柔軟性です。コア クラスに触れることなく、基になる実装を変更できます。

詳細については、 IoCオブザーバー パターンも確認してください。

于 2009-12-17T16:10:54.800 に答える
1

maven のリソース フィルタリングを public static final フィールドと組み合わせて使用​​できます。これは実際に条件付きでコンパイルされます。

private static final int MODE = ${mode};

...

if (MODE == ANDROID) {
    //android specific code here
} else {

}

ここで、「モード」と呼ばれる maven pom にプロパティを追加する必要があります。これは、ANDROID 定数と同じ値である必要があります。

Java コンパイラは (!) if および else ブロックを削除する必要があるため、Android コードが残ります。

testet ではないため、保証はありません。条件付きコンパイルではなく構成を優先します。

于 2009-12-17T15:39:41.890 に答える
1

m4をビルド プロセスに統合して、Java コンパイラの前にある C プリプロセッサに効果的に類似物を組み込むことができます。多くの手を振るのは「統合」ステップにありますが、m4はテキスト処理ジョブに適したテクノロジです。

于 2009-12-17T15:40:03.247 に答える
0

日食では、複数のプロジェクトを使用できます

  • Main (共通コードを含む)
  • Version1 (version1 コードを含む)
  • Version2 (version2 コードを含む)

    1. メイン -> プロジェクトを選択 -> プロパティ -> Java ビルド パス -> プロジェクト タブ
    2. [追加... ] を選択します。
    3. "Version1" xor "Version2" を追加して OK をワークスペースに戻します。

バージョン 1 とバージョン 2 には同じファイルが含まれていますが、実装が異なります。メインでは、通常、たとえば次のように記述します

import org.mycustom.Version;

また、Version1/Version2 プロジェクトを参照として含めた場合、Version1/Version2 プロジェクトの Version.java ファイルでコンパイルされます。

于 2009-12-17T15:42:30.857 に答える