私は長年の C++ プログラマーで、Java は初めてです。Eclipse で Java Blackberry プロジェクトを開発しています。質問 - プロジェクト内に異なる構成セットを導入し、それらに基づいてわずかに異なるコードをコンパイルする方法はありますか?
Visual Studio には、プロジェクト構成と #ifdef; があります。Javaには#ifdefがないことは知っていますが、ファイルレベルで何かあるのでしょうか?
私は長年の C++ プログラマーで、Java は初めてです。Eclipse で Java Blackberry プロジェクトを開発しています。質問 - プロジェクト内に異なる構成セットを導入し、それらに基づいてわずかに異なるコードをコンパイルする方法はありますか?
Visual Studio には、プロジェクト構成と #ifdef; があります。Javaには#ifdefがないことは知っていますが、ファイルレベルで何かあるのでしょうか?
「final」フィールドと ifs を設定して、コンパイルされたバイトコードをコンパイラに最適化させることができます。
...
public static final boolean myFinalVar=false;
...
if (myFinalVar) {
do something ....
....
}
コードのコンパイル時に「myFinalVar」が false の場合、「do something....」ビットはコンパイルされたクラスから失われます。複数の条件がある場合 - これは少し整理できます: それらをすべて別のクラス (「Config.myFinalVar」など) にシフトすると、条件をすべて 1 つのきちんとした場所に保持できます。
このメカニズムについては、「Hardcore Java」で説明されています。
【実はこれは先ほど投稿した「貧乏人のifdef」と同じ仕組みだと思います。】
これを 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
たとえば、一連の個別のディレクトリに各「アクション」を実装するなど、さまざまなクラスパスを管理できます。
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
それを貧乏人と呼ぶことができますかifdef
: http://www.javapractices.com/topic/TopicAction.do?Id=64 ?
いいえ、Javaはその機能に完全に一致するものはありません。アスペクトを使用することも、IOCコンテナーを使用してさまざまな実装クラスを挿入することもできます。
Maven、Ant、および同様の機能を提供するその他のビルド ツールに加えて、Java でインターフェイスを構築し、実行時に実装を切り替えることをお勧めします。
詳細については、戦略パターンを参照してください
Java の JIT コンパイラは実行時に最適化し、ほとんどの場合、このパターンをインライン化できるため、C/C++ とは対照的に、パフォーマンスが大幅に低下することはありません。
このパターンの大きな長所は柔軟性です。コア クラスに触れることなく、基になる実装を変更できます。
詳細については、 IoCとオブザーバー パターンも確認してください。
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 ではないため、保証はありません。条件付きコンパイルではなく構成を優先します。
m4をビルド プロセスに統合して、Java コンパイラの前にある C プリプロセッサに効果的に類似物を組み込むことができます。多くの手を振るのは「統合」ステップにありますが、m4はテキスト処理ジョブに適したテクノロジです。
日食では、複数のプロジェクトを使用できます
Version2 (version2 コードを含む)
バージョン 1 とバージョン 2 には同じファイルが含まれていますが、実装が異なります。メインでは、通常、たとえば次のように記述します
import org.mycustom.Version;
また、Version1/Version2 プロジェクトを参照として含めた場合、Version1/Version2 プロジェクトの Version.java ファイルでコンパイルされます。