• 締切済み

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やそのプラグインなどで目的が達せられれば問題ありません。 どなたか解決策をご存知であればご教示願います。

  • Java
  • 回答数2
  • ありがとう数1

みんなの回答

回答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

  • デバッグ中だけ、画面に出力したいときはどうすればいいでしょうか?

    デバッグ中だけ、画面に出力したいときはどうすればいいでしょうか? Visual Basic では debug.print("デバッグ中") といった関数が用意されていて、デバッグ中だけ動作できたのですが、java にもこういうのがないでしょうか? #ifdef DEBUG System.out.println("デバッグ中"); #endif などとすると、これだけで3行も場所を取りますし・・。

    • ベストアンサー
    • Java
  • #ifdef _DEBUGが効かない

    こんにちは。 Win2000、VC++6.0使用。 今までC言語でプログラムを組んではいましたが、 #define _DEBUG #ifdef _DEBUG print(...); #endif というようにデバッグ用のコードを入れたことはありませんでした。 このような便利なものがあると知り、早速使ってみたのですが、 #define _DEBUG の一文をコメントアウトして、再コンパイル(リビルド) して実行してみたのですが、 普通に #ifdef _DEBUG #endif で囲まれた部分が実行されてしまいます。 #define _DEBUG を宣言しなければ、実行されないと思っていたのですが 自分の勘違いでしょうか? よくわかりません。 どなたかご存知の方、よろしくお願いします。

  • ・Javaで、C言語の#defineに相当するもの

    ・Javaで、C言語の#defineに相当するもの 今までC/C++を使い込んできて、最近Javaの勉強を始めました。 C言語では条件分岐に使う定数を指定するのに#defineをよく使用していたのですが、Javaにもそれに相当するものはあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 綺麗なコードとは

    C言語において綺麗なコードを書くには、 コメントや書式をどのように書いたら良いのか教えてください。 例えば if(条件){    処理; }else{    処理; } を if(条件){    処理; } else{    処理; } と書いてみるなど。 よろしくお願いします。

  • プログラミングソースコード(アルゴリズム)の条件分岐の記述の仕方

    C言語始め擬似言語等プログラムで条件分岐はif~else以外にないのでしょうか?3つ以上に分岐する場合どのように記述するのでしょう?

  • javaでの#if 0 #endif文

    javaでC言語のような一部分のプログラムのコメントアウトとしての機能の#if 0に当たるコードはどのように書いたら良いでしょうか? どうぞ、教えて頂きますようお願い致します。

    • ベストアンサー
    • Java
  • java で #include

    Cでいう、#include をjavaでしたいのですが、何か手はありませんか? 例えば、 in hogehoge.java public class hogehoge { #include "hogehoge.h" コード一杯 } in hogehoge.h private static String=データ一杯 みたいなイメージです こんな感じも可能かな? in hogehoge.java public class hogehoge { public static main() { String hogedata[][]=hogehogedata.hogehogedataget(); } } in hogehogedata.java public class hogehogedata { private static String hogehogedata_all[][]=データ; public static String hogehogedataget() { return hogehogedata_all; } } スマートなやり方を御教授下さい。

    • ベストアンサー
    • Java
  • プログラムの評価に関して

    C言語のソースコードを解析、評価しています。 コードがコメント(//や/* */)および#ifdefを多用しており 有効なコードが埋もれて見遠しが悪くなっています。 地道に草むしりのように無効な文を削除していますが、 簡単に処理するソフトは無いものでしょうか。 // 必要なコメント(説明文)のため削除したくない /* */ ばっさり削除 define無効な#ifdef ばっさり削除

  • VCでプロジェクトの構成毎にアイコンを変えたいんですが・・・

    現在、VisualStudio6(SP5)でプログラムを作成しています。 デバッグ用とリリース用のexeに使用するアイコンを2つ用意し、デバッグ用exeとリリース用exeでデスクトップ等に表示されるアイコンの絵を変えたいのですが、なかなか思うようにいきません。 最悪はプロジェクトを2つ用意してやろうかな?とも思っているのですが、できれば1つのプロジェクトで実現したいのです。 どなたか実現方法をご存知であればご教示お願いします。 私が実施した内容は以下です。 結果はIDR_RELEASEのアイコンが使われています。 (1)IDR_MAINFRAMEを削除して、新しいアイコン ・IDR_DEBUG ・IDR_RELEASE を作成しました。 (2)Resource.hで、 #ifdef _DEBUG IDR_DEBUG 140 IDR_RELEASE 141 #else IDR_RELEASE 140 IDR_DEBUG 141 #endif と変更しました。 IDR_MAINFRAMEを削除した場合は最もID番号が小さいリソースアイコンが採用されると聞いたので、試しにやってみました。(ID番号が小さいほうのアイコンが使われることは確認しました。) ID番号は自動でつけられた2つの番号を順番を、プリプロセッサの定義で切り替えるようにやってみました。

  • 「もしテーブルが存在するなら削除する」

    「もしテーブルが存在するなら削除する」ってどうやればいいでしょう? DoCmd.DeleteObject acTable, "Table1" これでテーブルの削除は出来るのですが Table1が存在しない場合はエラーになります。 なのでこのコードを実行する前にテーブルの存在を確認したいのですが どうやってifで条件分岐すればよろしいでしょうか?

専門家に質問してみよう