アプリ版:「スタンプのみでお礼する」機能のリリースについて

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やそのプラグインなどで目的が達せられれば問題ありません。

どなたか解決策をご存知であればご教示願います。

A 回答 (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/2006 …
に書かれていますが、あまりシビアでなければ
コンパイラの最適化に期待した方が幸せかもしれません。
少なくともif文の条件式が定数値の場合の最適化くらいは
してくれると思います。
    • good
    • 0

こうしたものは、JavaではAOPを利用するのが一般的だろうと思います。

AOPというのは、多くのクラスで特定の地点で要求される処理を「横断的関心事(アスペクト)」として扱い、指定されたクラスに一斉に処理を外部から挿入したり取り除いたりする機能です。

AspectJというライブラリがそのための機能を提供します。が、Spring AOPを利用したほうがアノテーションでポイントカットを簡単に挿入できるので、私はもっぱらSpring利用です。AspectJやSpring AOPなどで検索してみてください。

AOPの場合、コードを挿入する位置はポイントカットと呼ばれる地点に限られており、だいたいメソッドの呼び出し前と呼び出し後という感じなので、細々とコード内に埋め込んでいくわけにはいきません。このへんが少し不自由な感じがするかも知れません。が、デバッグコードだけでなく、例えばテスト関連などでも用いられますし、データベースなどのダミーデータ挿入などいろいろ応用が効くので、覚えておいて損はないと思いますよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

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

お礼日時:2014/05/15 01:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!