[解決済み] javaのequals()メソッドをオーバーライドする - 動作しない?
質問
について、興味深い(そして非常に苛立たしい)問題に遭遇しました。
equals()
メソッドによって、十分にテストされたはずのクラスがクラッシュしてバグを引き起こし、その原因を突き止めるのに非常に長い時間がかかりました。
IDE やデバッガは使わず、昔ながらのテキストエディタと System.out を使っていました。時間が非常に限られており、学校のプロジェクトでした。
ともかくも-。
私は、基本的なショッピングカートを開発していました。
ArrayList
の
Book
オブジェクト
. を実装するために
addBook()
,
removeBook()
および
hasBook()
メソッドがあるかどうかを確認したい。
Book
の中にすでに存在する
Cart
. だから、私は行く - 。
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
テストではすべて正常に動作しています。6つのオブジェクトを作成し、データを入れています。に対して多くの追加、削除、has()操作を行います。
Cart
で、すべて正常に動作します。私はあなたができることを読みました
のどちらかです。
equals(TYPE var)
または
equals(Object o) { (CAST) var }
が、動作しているので、あまり重要ではないと判断しました。
そこで問題にぶつかった。
Book
オブジェクトに
のみ
その
ID
をBookクラス内から読み込むことができます。それ以外のデータは入りません。基本的には以下のような感じです。
public boolean hasBook(int i) {
Book b = new Book(i);
return hasBook(b);
}
public boolean hasBook(Book b) {
// .. more code here
return this.books.contains(b);
}
突然ですが、この
equals(Book b)
メソッドが動作しなくなりました。これは良いデバッガがないと突き止めるのに非常に長い時間がかかりました。
Cart
クラスは適切にテストされ、正しいものでした。を入れ替えた後
equals()
メソッドを以下のように変更しました。
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
すべてが再び動き出しました。このメソッドが Book パラメータを取らないと決めた理由は何ですか?
でした。
a
Book
オブジェクトを作成できますか?唯一の違いは、同じクラス内からインスタンス化され、1つのデータ・メンバーで満たされているように見えました。私は非常に非常に混乱しています。どうか、光を当ててください。
解決方法は?
Javaでは
equals()
から継承されるメソッドです。
Object
があります。
public boolean equals(Object other);
つまり、パラメータは必ず
Object
. これは
オーバーライド
;あなたのメソッド
public boolean equals(Book other)
と呼ばれるものを行います。
オーバーロード
を
equals()
メソッドを使用します。
は、その
ArrayList
はオーバーライドされた
equals()
メソッドで内容を比較します(例えば、その
contains()
と
equals()
メソッド) を使用します。
ない
をオーバーロードしたもの。あなたのコードの大部分では、適切にオーバーライドされていないものを呼び出すと
Object
のequalは問題なかったが、互換性がない。
ArrayList
.
そのため、メソッドを正しくオーバーライドしないと、問題が発生する可能性があります。
私は毎回以下のようにオーバーライドしています。
@Override
public boolean equals(Object other){
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof MyClass)) return false;
MyClass otherMyClass = (MyClass)other;
...test other properties here...
}
の使用は
@Override
アノテーションを使用することで、間違いを減らすことができます。
スーパークラスやインターフェイスのメソッドをオーバーライドするときは、いつでもこれを使います。そうすれば、もし間違ったやり方をすれば、コンパイルエラーになる。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] JavaでequalsとhashCodeをオーバーライドする際に考慮すべき事項は?
-
[解決済み] なぜJavaは静的メソッドのオーバーライドを認めないのですか?
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
をインスタンス化することができません。
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
javaでクラスを作成すると、enclosing classでないように見える
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。