Java の `.equals()` メソッドの `getClass()` と `instanceof` : どちらが優れていますか?

Barbara Streisand
リリース: 2024-11-25 03:38:11
オリジナル
637 人が閲覧しました

`getClass()` vs. `instanceof` in Java's `.equals()` Method: Which is Better?

.equals() の生成における getClass() と instanceof の優先使用法

.equals() および .equals() に Eclipse のコード ジェネレーターを利用する場合.hashCode() では、型比較に「instanceof」を使用するオプションが表示される場合があります。 .getClass()。デフォルトの選択は .getClass() ですが、この記事では、instanceof よりも .getClass() を使用することに利点があるかどうかを検証します。

instanceof を使用しない場合の比較:

if (obj == null)
  return false;
if (getClass() != obj.getClass())
  return false;
ログイン後にコピー

を使用した比較instanceof:

if (obj == null)
  return false;
if (!(obj instanceof MyClass))
  return false;
ログイン後にコピー

通常、null オブジェクトは必然的に instanceof に失敗するため、instanceof オプションを使用し、「if (obj == null)」チェックを削除することをお勧めします。しかし、このやり方は本質的に間違っているのでしょうか?

instanceof の議論

有名な Java 専門家 Josh Bloch は、次の理由を挙げてこのアプローチを支持しています。

  • getClass() を使用すると、オブジェクトの同等性が同じクラスに属するもののみに制限されます
  • クラスが無害なメソッドで拡張されている場合、サブクラスとスーパークラスのオブジェクトは、本質的なプロパティが同じであるにもかかわらず、誤って等しくないとみなされる可能性があります。
  • これはリスコフ置換原則に違反します。予期しない動作につながる可能性があります。
  • Java のコレクション フレームワーク (HashTable など) に大きく依存しています。イコールメソッド。 .getClass() を使用すると、不平等が認識されるため、サブクラス インスタンスでクエリを実行した場合、スーパークラスのオブジェクトをハッシュ テーブルから取得できない場合があります。

追加リソース

  • [SO答え](https://stackoverflow.com/questions/2810849/what-is-the-performance-complexity-of-using-instanceof-keyword-in-java)
  • [有効な Java の章] 3](https://books.google.com/books?id=XY6a0H0G7LsC&pg=SA3-PA34&lpg=SA3-PA34&dq=ジョシュ・ブロック getClass のインスタンスイコール&ソース=bl&ots=1P2j4a8S-Q&sig=ACfU3U0pWgTLs2MNGhf5Nq4Giq6hYH8MgQ&hl=ja)

以上がJava の `.equals()` メソッドの `getClass()` と `instanceof` : どちらが優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート