あなたの質問に答える1つの方法は、「固体Javaライブラリではいつinstanceof
を使用するのですか?もし、適切に設計されたJavaライブラリの例がGuavaであるとすれば、instanceof
のどこでそれを受け入れるかを決めることができます。
Guavaのソースコードjarを抽出してgrepしたら、 instanceof
は122個のファイル間、439回言及されています
$ pwd
/tmp/guava-13.0.1-sources
$ grep -R 'instanceof' | wc -l
439
$ grep -Rl 'instanceof' | wc -l
122
そして、我々はいくつかのパターンが現れる見ることができ、これらの例いくつかを見て:平等を確認するには
-
これは最も一般的な使用法です。これは実装固有のものですが、拡張/実装するクラス/インタフェースに基づいて等価性を実際に測定したい場合は、instanceof
を使用して、使用するオブジェクトを確実に確認してください。しかし、子クラスがequals()
をオーバーライドし、親クラスと同じものを尊重しない場合、これは奇妙な問題を引き起こす可能性があります。例はどこにでもありますが、簡単なものはLists.equalsImpl()
で、これはImmutableList
で使用されています。短絡不要なオブジェクトの構築に
それはすでに希望のインスタンスの場合は、安全に使用または返却することができ、引数で渡された場合、たとえば、さらにそれを変換せずにチェックするためにinstanceof
を使用することができます私たちが知っていれば、それは不変です。しかし、特に、静的なユーティリティクラスでは、など
これは全てのGuava内の場所で見ることができます異なる振る舞い
をさらすことなく、実装の詳細にアクセスするには、ImmutableList.copyOf()
、Suppliers.memoize()
、CharMatcher.forPredicate()
の例を参照してください。 com.google.common.collect
パッケージ(例えば、Iterables.size()
)であり、可能であればCollection.size()
が呼び出され、それ以外の場合はイテレータの項目数がO(n)
時間にカウントされます。
私はこのメリットは、以上の非常に少数精鋭のケースで行われている懐疑的だけど、あなたは正しいことをやっている確信していると仮定すると、あなたは不回避することができますtoString()
を呼び出さないようにするにCharSequence
オブジェクトをString
sにinstanceof
と変換すると、Joiner.toString(Object)
で行われます。
を扱う複雑な例外を行うには明らかに行うには「正しい」ものは(実際に、それはすでにinstanceof
チェックをやっているが)try/catch
ブロックを使用しているが、時にはあなたはそのメリットより複雑な処理ロジックを持っています条件付きブロックを使用するか、別のメソッドに処理を渡すことができます(たとえば、原因を取り除くか、実装固有の処理を行うなど)。例はSimpleTimeLimiter.throwCause()
にあります。この動作を見て際立って
一つは、ほぼすべてのそれらの問題に対処しているされて私はを解決すべきではありません。ライブラリコードで便利です(例: Iterables
にありますが、もし私がこの振る舞いを実装しているなら、私のためにこれを解決するライブラリやユーティリティがないかどうか、私はおそらく自分自身に尋ねるべきです。
すべての場合、instanceof
のチェックは、実装の詳細として内部でのみ使用する必要があります。つまり、instanceof
チェックに依存するすべてのメソッドの呼び出し元は、(簡単に)それを伝えることができません。あなたがしたこと。たとえば、ImmutableList.copyOf()
は常にImmutableList
を返します。実装の詳細としては、新しいImmutableList
を構築することを避けるためにinstanceof
を使用しますが、これは予想される動作を受け入れられるようにする必要はありません。
私はグアバのソースコードを掘り下げていたので、あなたの名前にルイスが来て面白かったです。私は分かりませんでした!
Hmmmmm。念頭に置いた例私はこれまで使ってきたAPIでこの必要性に遭遇していません。 –
@LouisWassermanたとえば、私たちは様々なFTPクラスが共通の基底クラスを拡張したり、インタフェースを実装したりしていないサードパーティのAPIを持っていたなど、OO以外の方法で記述されたものです。それらを「同じ」ものとして扱うために、私たちの迅速な回避策は、いくつかの簡単なインスタンスチェックを行いました。最終的にはレイヤーを上に置きます。世界には数多くの悪いAPIがあります。 –
Ew。私はそれらの獣のいずれかに対処しなければならないことに感謝しなければならないと思います。 –