Javaのデバッグ出力を考えた

Javaでのデバッグ出力を考えるにあたって、まず欲しい要素はこんな感じ。

  • 色んな種別を分けて、デバッグ出力を種別毎にon/offできるようにしたい
  • 種別を分けるにあたって、コード補完が効く程度の利便性
  • 文字列だけしか渡せないのは面倒なので、System.outを真似る

手元で実行してコードのどこを通っているか、変数の値などを確認する用途にする。パフォーマンスはさほど気にしない。出力先はコンソール(System.out)にする。

好きなオブジェクトを渡せるように手で実装するのは大変なので、PrintStreamを含んでしまう形にするとするなら、以下の形のどれかを思いつきます。

  • クラスにPrintStreamを継承させる
  • クラスのフィールドにPrintStreamを持つ
  • メソッドの戻り値がPrintStream

最初と最後は呼び出すときには同じ形ですし、get(Kind)の実装もKindをEnumで表すしか思いつかないので、PrintStreamを継承したクラスというのは考えないことにします。

誰でもデバッグ出力には、そんなに時間をかけたくはないと思うので、新しい種別の追加についても考えます。

圧倒的にEnumのほうが見やすいです。Enumから直にprintlnとか呼べればいいのですが、手で実装しない限り無理です。実際に実装して試したところ、関数へ渡す値で親を省略した場合Enumの補完は効かなかったので定数で管理することにしました。

一応Enumで管理するものも置いておきます。書いたのに使わないコードってちょっと寂しいので。

PrintStreamで出力させないようにするには、何もしないOutputStreamを継承したクラスをコンストラクタに渡してあげています。

定数版

Enum版

 

カテゴリー: Java, プログラミング関連 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です