web-dev-qa-db-ja.com

ループミスをどのように回避しますか?システムによって検出されない間違い

私はこのクレイジーな初期化をしました-

documentList = new ArrayList<Map<String,Integer>>();

これは、ループ内で毎回新しいマップを保存するつもりでしたが、残念ながらループ内に配置しました。そして、あなたは大混乱を知っています。

そのような間違いをどのように検出しますか? 「推奨されるデバッグ手法」に関する提案を探しているかもしれませんが、より専門的なアドバイスも探しています

1

これらの間違いはシステムによって検出可能であり、簡単に回避できます。不変性を受け入れる。

少なくともdocumentListfinalとして宣言してください。これにより、コンパイラはこの特定のエラーについてすぐに通知します。残念ながら、Javaは、実際の不変リストや高階関数など、関数型プログラミングの優れた点をすべて備えているわけではありませんが、少なくともfinalは、完全に新しいリストの最初のリスト。documentList.clear()を呼び出すなどの間違いを犯すこともありますが、偶然に発生する可能性ははるかに低くなります。

したがって、いつものように、私はそのような間違いを検出しなければならないという道をたどらないようにしていますが、そのような間違いがまったく起こらないことを即座に保証するスタイルでコードを書くようにしています。正当な理由で、可変性はt-r-o-u-b-l-eと綴られているので、必要がない限り、その道を絶対に歩かないでください。 finalとして宣言できるコードの部分が多いほど、優れています。

8
Frank

このようなバグを見つける最善の方法は、実行時に頭を上げないようにすることです。これは、いくつかの方法で実現できます(相互に排他的ではありません)。

  1. コンパイラがエラーを検出できるようなスタイルでコードを記述します。いくつかの例は、不変性(const/final@ Frankによる回答 )で自由に使用すること、または次のような等価性テストを作成することです。 42 == x割り当ても合法である状況で。

  2. 2番目の目でコードを確認します(コードレビューを実行します)。