私はこのように見えることのtoStringの実装を持つドメインモデルクラスがあります。
public String toString() {
try {
return getX() + "\n"
getY() + "\n"
getZ(); //etc.
} catch(Exception e) {
throw new RuntimeException(e);
}
}
方法getX()
、getY()
およびgetZ()
シンプルなゲッターではありません、彼らは、バックグラウンドで事前に定義されたキーと値のペアの静的なマップに、一般的に参照をルックアップを実行することができます。それらのいくつかは持っていたthrows SomeCheckedException
彼らの署名で。
私の印象は、これは悪い習慣と「コードのにおい」であるということです。実際toString()
にも、このチェックが必要であるが、私に悪いデザインの症状です。私は同僚に頼まだ。しかし、正確に何ジェネリックを引くと間違っているException
にtoString()
巻き込まことからすると、Exception
さらに増殖されます。
私のような簡単な方法以来、それは、少なくとも、KISSの原則に違反すると信じてtoString()
、ここでは特別な例外処理を必要とするものとして示されています。
だから、コードのにおいは)(のtoStringにキャッチオールブロックを持っているのですか?
私が見つけた答えは、一般的なキャッチの一般的なシナリオのいずれかであったException
と私はあなたがして、一般的なエラー処理機構やバッチをやっている場合は、それが一般的な例外の作業に期待だと、それらのほとんどに同意します。この引数は、我々の議論に説得されたので、私は他の意見の好奇心が強いです。
以下のためtoString()
の方法、キャッチは Exception
必ずしも悪い習慣ではありません。しかし、再投げ、それは問題の部分です。
契約のtoString()です:
...一般に、toStringメソッドはこのオブジェクトを「テキストで表す」という文字列を返します。結果は、人間が読める簡潔で有益な情報であるべきです...
効果的なJavaの第3版(項目12)では、ブロッホはさらに主張しています:
ときに実用的な、toStringメソッドは、オブジェクトに含まれる興味深い情報のすべてを返す必要があります。
これはチェック例外をスローすることがメソッドを呼び出す必要があれば、そのようにそれをすること、そしてそれは、これらの例外をキャッチするために多くの意味になります。
しかし:提起チェック例外は、オブジェクトの状態に関する情報を提供します。一貫しての目標とtoString
、で返されるメッセージで例外条件を含めることは良い考えかもしれtoString
。
それから、例外をスローすることは悪い考えである理由についてはtoString
、この記事は偉大な答えを提供します。
推奨事項:その特定の例外タイプを使用してチェック例外をキャッチし、この事実を統合するtoString()
代わりにそれを伝播するの、メッセージ。