8

Java と Groovy のコードが混在するコード ベースがあります。Groovy コードの反復では、クロージャーを使用する傾向があります。

String[] strings = ["First", "Second", "Third"]
strings.each { string ->
    println string
}

IntelliJ IDEA (v. 11) で一度に 1 行ずつステップ実行してこれをデバッグすると、strings.each()(つまりprintln string) で実行されているコードがステップオーバーされます。行にブレークポイントを設定しprintlnてデバッグすることはできますが、これは避けたほうがよい回避策です。

Groovy クロージャーをステップオーバーしないように intelliJ を構成する方法はありますか? File->Settings->Debugger->Groovyに該当するオプションはありません。

編集:

intelliJに期待することを明確にするために:

次のような Java スタイルの反復があるとします。

for (String string : strings) {
    println string
}

「ステップオーバー」を使用すると、デバッガーは問題なく反復にステップインします。「ステップオーバー」を続行し、反復するオブジェクトがなくなるまでループに入ることができます。これは、上記のような閉鎖に私が期待するものです。

手動でブレークポイントを設定する必要がある 1 つまたは 2 つのクロージャーがある場合は、問題にならない可能性があります。しかし、たくさんある場合は、それらに「自動的に」ステップインするのは本当に素晴らしいことです。

4

1 に答える 1

6

IntelliJ で Closure デバッグ サポートを改善する必要があることに完全に同意します。

あなたが見つけたように、println行にブレークポイントを置くことができます。これにより、通常はクロージャー内でブレークできます (常にではありません)。ブレークポイントを設定する、IntelliJ には非常に強力な条件付きブレークポイント システムが備わっているため、いつブレークするかをより適切に制御できます。

私が時々役立つと思ったもう 1 つの方法は、コードを直接クロージャーに入れるのではなく、これらのクロージャーのすべてを取り込んで、クロージャーが呼び出すメソッドに投げ込むことです。これによってランタイムの動作が大きく変わることはありません。また、これにより、より多くのことを制御できるようになることがわかりました。また、通常は、コードを掘り下げるのが面倒なので、リファクタリングも必要であることを示しています。

于 2013-03-12T14:07:52.247 に答える