- - PR -
デバッグ時に HashMap/HashSet の中身を素早く見る方法は?
投票結果総投票数:19 | |||
---|---|---|---|
HashMap/HashSet をひたすら覗く | 3票 | 15.79% | |
デバッグ用の Map/Set を作って使う | 1票 | 5.26% | |
便利なライブラリーがある | 1票 | 5.26% | |
eclipse に | 14票 | 73.68% | |
|
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-03-10 11:35
eclipse などでデバッグしている時に、配列や ArrayList の中身は簡単に覗けるのですが、HashMap や HashSet の中身はその内部構造が複雑であり、中になにが入っているのかを探すのが一苦労です。
みなさまはどうやってデバッグされているのでしょうか?Hash を使わずに、Hash を使わない自前のシンプルな Map や Set の実装クラスを作って、それを一時的に使えば良いのでしょうが、本番時に HashMap/HashSet に切り替えるのも面倒です。equals と hashCode のオーバーライドの間違いなども発見しにくくなるような気がします。 望むのとしては eclipse のデバッガーを動かすと、自動的に HashMap/HashSet のデバッグバージョンにすりかえて動いてくれるようなことを期待するのですが、それに近いものってなにかないでしょうか。 投票機能: ・HashMap/HashSet をひたすら覗く ・デバッグ用の Map/Set を作って使う ・便利なライブラリーがある ・eclipse にそういう機能がある -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||||||
|
投稿日時: 2007-03-10 11:54
List/Map/SetはtoString()で済ませることが多いですね。
配列クラスはさすがにデバッガですが。 バッドノウハウかもしれませんが、 本番とデバッグで切り替えたいのであれば、ファクトリを使うのは如何でしょう。 例えば、Map map = MapFactory.newMap(); 本番とデバッグでファクトリの中だけ差し替えれば大丈夫です。 | ||||||||||||||||
|
投稿日時: 2007-03-10 17:05
3.2系だとブレークした際のオブジェクトの内容が見やすくなりましたね。
| ||||||||||||||||
|
投稿日時: 2007-03-10 17:37
コレクションの要素に入れるクラスで toString() を定義しておけば(あるいは toString() を持っているクラス(String や Integer など)を使えば)、良いのですね。しかし、クラスが何十個もフィールドを持っていたり、クラスAがクラスBを集約していたりすると、toString() が定義しきれないので悩んでいます。
切り替えが面倒、ということと、ソースコードをパッと見たときやあるいはソースコード内を検索する際に、HashMap を使うことを予期していることが分かりにくい、ということでちょっと億劫になっています。あと、人が書いたコードの中までデバッガーで追いかけるような場合は、対処できない、ということもあります。(事前に分かればそこだけファクトリーに差し替えてからデバッガーを起動すれば良いわけですが。)
これは良く分かりませんでした。普段、3.2 を使っているのですが新機能があるのでしょうか。 結局、かつのりさんの toString() ということにヒントを得て、つぎのようなやりかたなら便利かな、と考えました。
変数 set の中身を見たいときに、eclipse の Expressions のウィンドウの中で "Add Watch Expression" をおこない、そこに、 new SetList(set) を指定します。 こうすると配列で表示されます。 簡単にするため Set の例を書きましたが、Map もこの応用でできるかなと思っています。 #以下、あとで追加。 nagiseさんが書かれた3.2系のは "Detail Formatter" という機能なのですね。Expressions のウィンドウで右クリックするとこの機能を呼び出せますね。こういう機能があるとは今まで知りませんでした。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} [ メッセージ編集済み 編集者: unibon 編集日時 2007-03-10 17:46 ] | ||||||||||||||||
|
投稿日時: 2007-03-10 18:15
デバッガでも文字列表現は見えますので、
System.out.printlnで出力する必要がないですね。 値を示すオブジェクトはCommons-LangのToStringBuilderで予め、 出力時を考慮しておくといいかもしれません。 リフレクション対応のToStringBuilderもあるので、 基底クラス側で定義しておいて、 各値クラスは基底クラスを継承するというのもありでしょう。 すでに進んでしまっているプロジェクトでは難しいかもしれませんが・・・ | ||||||||||||||||
|
投稿日時: 2007-03-10 20:39
AspectJを使って、デバック文,ダンプ等を追加してみるのも手かな。 | ||||||||||||||||
|
投稿日時: 2007-03-11 14:26
3.2系からは「変数」のビューに「論理構造の表示」アイコンがついており、
Mapなどのコレクションの表示方法を切り替えることが出来ます。 たとえばTreeMapの場合、通常モードでは
とったフィールドの表示になります。 Map内のエントリを確認するにはrootを開いて leftとrightのエントリを開いて…と2分木を辿る必要がありました。 「論理構造の表示」モードにすると
といったように配列のごとくエントリが表示されます。 この機能のおかげで随分とデバッグがやりやすくなりました。 <編集>codeタグをつけました</編集> [ メッセージ編集済み 編集者: nagise 編集日時 2007-03-11 19:27 ] | ||||||||||||||||
|
投稿日時: 2007-03-11 15:11
自分の備忘録も兼ねて補足します。
変数ビューの「論理構造の表示」機能については、 Eclipse 3.2の付属のヘルプのTips and Tricks (JDT)の 「Logical Structures(論理構造)」や「Detail formatters(詳細フォーマット)」で 説明されています。 これらはJavaの標準ライブラリ以外のクラスに対しても独自に設定することができるようです。 設定画面は以下の場所にあります。(日本語版の場合) - ウィンドウ -> 設定 -> Java -> デバッグ の「詳細フォーマット」と「論理構造」 英語版では以下の場所にあります。 - Window > Preference > Java > Debug の 「Detail Formatter」と「Logical Structure」 私自身はlog4jに出力するときのために、大抵はtoString()メソッドをオーバーライドしているので、 (製造初期はJakarta Commons LangのToStringBuilder, RefrestionToStringBuilderを使い、 あとで性能に影響する部分だけ手で書き直す)、この機能は使ったことがないのですが、 便利そうです。 |