• 締切済み

Javaでのデバッグコード削除

Javaで条件分岐などによってコード自体を削除することはできるのでしょうか。 目的はデバッグコードの負荷軽減です。 C言語でいうところの、プリプロセッサのようなことができることが理想です。 例えば、メソッド中に以下のようなコードがあるとします。 ------------------------------------ final boolean DEBUG = true; if (DEBUG) System.out.println("Debug: hogehoge"); ------------------------------------ 上の場合はif文条件分岐の処理負荷が発生すると思います。 この程度であれば低負荷であることは認識していますが、どうも気持ちが悪いです。 例えば、C言語であれば以下のようにしてコンパイル時にコードごと削除することができると思います。 ------------------------------------- #define DEBUG int main(){ #ifdef DEBUG    printf("Debug: hogehoge"); #endif return 0; } ------------------------------------- Javaで上記のようなことを実現することは可能でしょうか。 デバッグコードの削除が目的ですので、仮にこれができなかったとしてもIDEやそのプラグインなどで目的が達せられれば問題ありません。 どなたか解決策をご存知であればご教示願います。

みんなの回答

回答No.2

「java プリプロセッサ」で検索すれば、Java用に作られた プリプロセッサがいくつか見つかります。 (参考) http://mfsocket.blogspot.com/2011/08/001java.html また、Cコンパイラにjavaソースをプリプロセッサ処理させる という手もあります。 (参考) http://www.symmetric.co.jp/blog/archives/21 ただ、上記参考URLにも書かれている通り、 こういったプリプロセッサ処理をやるとeclipseとの連携が 難しくなります。 http://blawat2015.no-ip.com/~mieki256/diary/200609121.html に書かれていますが、あまりシビアでなければ コンパイラの最適化に期待した方が幸せかもしれません。 少なくともif文の条件式が定数値の場合の最適化くらいは してくれると思います。

すると、全ての回答が全文表示されます。
noname#247307
noname#247307
回答No.1

こうしたものは、JavaではAOPを利用するのが一般的だろうと思います。AOPというのは、多くのクラスで特定の地点で要求される処理を「横断的関心事(アスペクト)」として扱い、指定されたクラスに一斉に処理を外部から挿入したり取り除いたりする機能です。 AspectJというライブラリがそのための機能を提供します。が、Spring AOPを利用したほうがアノテーションでポイントカットを簡単に挿入できるので、私はもっぱらSpring利用です。AspectJやSpring AOPなどで検索してみてください。 AOPの場合、コードを挿入する位置はポイントカットと呼ばれる地点に限られており、だいたいメソッドの呼び出し前と呼び出し後という感じなので、細々とコード内に埋め込んでいくわけにはいきません。このへんが少し不自由な感じがするかも知れません。が、デバッグコードだけでなく、例えばテスト関連などでも用いられますし、データベースなどのダミーデータ挿入などいろいろ応用が効くので、覚えておいて損はないと思いますよ。

stragemax
質問者

お礼

回答ありがとうございます! Spring AOPなるものについて調べてみました。 確かに任意の箇所にコードを挿入するのは難しいようですが、きちんとモジュール化されているものであれば、十分に役割を果たせそうです。 存在を知らなかったので、大変勉強になりました。ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A