フラグに従ってクラスの finalize メソッドを削除するコンパイル時の解決策を見つけたいと思います。これは、GCのパフォーマンスの問題を回避するためです。
私のビルドシステムは ANT です。
基本的に、この C プリプロセッサ マクロと同等のものが必要です。
#ifdef USE_FINALIZE
protected finalize() {
...
}
#endif
これはJavaで可能ですか?
フラグに従ってクラスの finalize メソッドを削除するコンパイル時の解決策を見つけたいと思います。これは、GCのパフォーマンスの問題を回避するためです。
私のビルドシステムは ANT です。
基本的に、この C プリプロセッサ マクロと同等のものが必要です。
#ifdef USE_FINALIZE
protected finalize() {
...
}
#endif
これはJavaで可能ですか?
簡単に言うと、これを行うための組み込みの方法はありません。Java 条件付きコンパイル: コード チャンクがコンパイルされないようにする方法を参照してください。詳細については。
ただし、置換タスクを使用して、Ant を使用してカスタム ソリューションを構築できる可能性があります。これを行うには、時々含めたいブロックの周りのコメントに魔法の文字列を入れるだけです.
/******CONDITIONAL******
// conditional code goes here
*******CONDITIONAL*****/
次に、replace を使用して、条件付きプロパティに基づいてこれらのコメントを削除します。
ミラーAPIを使用して、コンパイル時に注釈プロセッサを使用することはおそらく可能ですが(まったくわかりません)、達成するのは難しいと思います。
Javassist または CGLib を使用すると、おそらくランタイムでも可能です。
javadocによると
クラス Object の finalize メソッドは特別なアクションを実行しません。単に正常に戻ります。Object のサブクラスは、この定義をオーバーライドできます。
つまり、
a) コードで明示的に宣言しない限り、特別なファイナライズを行っていない。
b) finalize() メソッドを含めない場合、Object.finalize() が呼び出されますが、これはノーオペレーションです。したがって、どうにかしてjvmをハックしてファイナライズを呼び出さないようにしない限り、それを改善することはできません。
より適切な質問は、アプリケーションのファイナライズ時間について心配する特定の理由はありますか? ということです。これをプロファイリングしましたか?これがアプリケーションの問題ではない可能性は十分にあります。