2012-02-22 14 views
4

Javaのinstanceof演算子を多用しているコードを調べています。これは一般的な質問であるので、私は細部に至る誘惑と戦います。 instanceofは、C++の動的なキャストと、あなたがそれが必要だと思うなら、おそらくあなたのモデルがオフであることを、私がそれについて読んだアドバイスを思い出させます。これはまだ従来の知恵ですか?それはJavaのinstanceofに当てはまりますか?instanceofは危険ですか?

+1

個人的なメモ、私はすぐにどの言語機能悪を呼び出すか、それは決して使用すべきではないと言います。はい、でも行こう。代わりに、瞬きのタグがたくさんある古い地質のサイトのような、あなたがそれらを見るときに際立つべき特定のパターンがあり、プログラマーに「この選択を守るために準備しておく方が良い」と言います。これらのケースの1つであるinstanceOfが頻繁に出現しているのですか、あるいは状況によっては非常に自然ですか? – derekv

+1

私はそれを考えると、反射過剰使用はおそらく良くなく、再設計のための考察を示唆していますが、使用を避けることができない状況がいくつかあります。 –

+0

[instanceofは悪い習慣とみなされますか?もしそうなら、どんな状況下でもなお望ましいものですか?](http://stackoverflow.com/questions/2750714/is-instanceof-considered-bad-practice-if-so-under-what-c​​ircumstances-is-instan) –

答えて

11

はい、あなたは正しい方向にあります。 instanceofは確かにその用途を持っていますが、大量の使用は一般にクラスデザインが不十分であることを示しています。

+1

誰がこれを落としたの?それは正に正しい答えです。多くの 'instanceOf'を使用する必要がある場合、私はあなたの情報フローに欠陥があると仮定します。通常、コードの与えられた部分は、渡されているクラスを尋ねる必要はありません。例外はもちろん可能であり、非常に多くあります。 InstanceOfは、ある意味では反射機能であり、常にリフレクションを慎重に使用しなければなりません。 – markus

+1

'instanceof'の使用が設計上の欠陥を示している理由を説明しなければ、この回答は不完全です。 –

+0

私は 'instanceof'の使用が単にオブジェクト指向ではないということを維持するプログラミング言語に関する講座に参加しました。期間。 – Giorgio

3

Javaの場合、instanceofキーワードの数を減らすにはジェネリックを使用する必要があります。そのようにして、コンパイル時に知られていない少数しかチェックする必要はありません。つまり、instanceofgotoのようなものではありません。制御フローをあまり混乱させません(注意しないと、多くの余分な変数を導入します)。

私はinstanceofを定期的に使用していますが、多くの場合はそれをコードのにおいとみなします。トリックは何か良いものを考え出すことです。可能であれば、instanceofの使用はおそらく間違っています。私は、使用が一般的なケースで良いか悪いかを確認する体系を知らないだろう。キャストの後にinstanceofはおそらくキーワードそのものよりも痛いです。

+1

実際には、間違ったequalsメソッドを微妙に作成できるので、instanceofはequalsメソッドで使用することがよくありません。 equalsの最適なデフォルトは '(getClass()== o.getClass())'を使うことです。あなたがすべて「等しい」複数のタイプをサポートする必要がある場合にのみ、instanceofを使用してください。 – jtahlborn

+0

@jtahlborn:それは良い点ですが、 'instanceof'を使う多くのequals()メソッドによって洗脳されているに違いありません。答えの最後の部分を削除しました。 –

+0

残念なことに、これはデフォルトの実装であり、単純な例としてよく使用されるか、IDEによって生成されます。 – jtahlborn

関連する問題