import java.util.Objects;
// Book クラスã®å®šç¾©
class Book {
private String title;
private String author;
// コンストラクタ
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// equals メソッドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰
@Override
public boolean equals(Object obj) {
// 自分自身ã¨ã®æ¯”較
if (this == obj) return true;
// null ã¾ãŸã¯ç•°ãªã‚‹ã‚¯ãƒ©ã‚¹ã¨ã®æ¯”較
if (obj == null || getClass() != obj.getClass()) return false;
// obj ã‚’ Book クラスã«ã‚ャスト
Book otherBook = (Book) obj;
// title 㨠author ã®ãƒ•ィールドãŒç‰ã—ã„å ´åˆã« true ã‚’è¿”ã™
return Objects.equals(title, otherBook.title) &&
Objects.equals(author, otherBook.author);
}
// hashCode メソッドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰
@Override
public int hashCode() {
// title 㨠author ã®ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’組ã¿åˆã‚ã›ã¦è¿”ã™
return Objects.hash(title, author);
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Book インスタンスã®ç”Ÿæˆ
Book book1 = new Book("Java Programming", "John Doe");
Book book2 = new Book("Java Programming", "John Doe");
// equals メソッドã®ä½¿ç”¨ä¾‹
System.out.println("Are books equal? " + book1.equals(book2));
// hashCode メソッドã®ä½¿ç”¨ä¾‹
System.out.println("Hash code for book1: " + book1.hashCode());
System.out.println("Hash code for book2: " + book2.hashCode());
}
}
ã“ã®ä¾‹ã§ã¯ã€equals メソッドã§ã¯ Objects.equals メソッドを使用ã—ã¦ã€hashCode メソッドã§ã¯ Objects.hash メソッドを使用ã—ã¦ã„ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€null ãƒã‚§ãƒƒã‚¯ã‚„ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã®è¨ˆç®—ãŒç°¡æ½”ã«è¡Œãˆã¾ã™ã€‚
ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¯”較ã¨ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°
ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¯”較 (equals メソッド):
Javaã§ã¯ã€equalsメソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ã§ã€ã‚ªãƒ–ジェクトã®ç‰ä¾¡æ€§ï¼ˆequality)を定義ã§ãã¾ã™ã€‚デフォルトã®equalsメソッドã¯å˜ã«ã‚ªãƒ–ジェクトã®å‚ç…§ãŒåŒã˜ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ãŒã€ç‹¬è‡ªã®ã‚¯ãƒ©ã‚¹ã§ã¯æ„味ã®ã‚る比較をæä¾›ã™ã‚‹ãŸã‚ã«equalsメソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ãŒä¸€èˆ¬çš„ã§ã™ã€‚
equalsメソッドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã«ãŠã„ã¦ã¯ä»¥ä¸‹ã®ç‚¹ã«æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚
- 自己å‚照(Reflexive): ä»»æ„ã®éžnullã®å‚照値
xã«å¯¾ã—ã¦ã€x.equals(x)ã¯trueã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - 対称性(Symmetric): ä»»æ„ã®éžnullã®å‚照値
xãŠã‚ˆã³yã«å¯¾ã—ã¦ã€x.equals(y)ãŒtrueã‚’è¿”ã™å ´åˆã€y.equals(x)ã‚‚trueã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - 推移性(Transitive): ä»»æ„ã®éžnullã®å‚照値
xã€yã€zã«å¯¾ã—ã¦ã€x.equals(y)ãŒtrueã‚’è¿”ã—ã€ã‹ã¤y.equals(z)ãŒtrueã‚’è¿”ã™ãªã‚‰ã°ã€x.equals(z)ã‚‚trueã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - 一貫性(Consistent): ä»»æ„ã®éžnullã®å‚照値
xãŠã‚ˆã³yã«å¯¾ã—ã¦ã€x.equals(y)ã®è¤‡æ•°å›žã®å‘¼ã³å‡ºã—ã¯å¸¸ã«åŒã˜çµæžœã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - nullã§ãªã„ã“ã¨ï¼ˆNon-nullity): ä»»æ„ã®éžnullã®å‚照値
xã«å¯¾ã—ã¦ã€x.equals(null)ã¯falseã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
Objects.equalsメソッドã¯nullã«å¯¾ã™ã‚‹å®‰å…¨ãªæ¯”較をæä¾›ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れã¦ã„ã¾ã™ã€‚ã“れã¯Java 7以é™ã§åˆ©ç”¨å¯èƒ½ã§ã™ã€‚
ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚° (hashCode メソッド):
hashCodeメソッドã¯ã‚ªãƒ–ジェクトã®ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰ã§ã™ã€‚ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã¯ã‚ªãƒ–ジェクトをãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルãªã©ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«æ ¼ç´ã™ã‚‹éš›ã«ä½¿ç”¨ã•れã¾ã™ã€‚
hashCodeメソッドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã«ãŠã„ã¦ã¯ä»¥ä¸‹ã®ãƒã‚¤ãƒ³ãƒˆã«æ³¨æ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- 一貫性(Consistent): オブジェクトãŒå¤‰æ›´ã•れãªã„é™ã‚Šã€
hashCodeメソッドã®å‘¼ã³å‡ºã—ã¯ä¸€è²«ã—ã¦åŒã˜çµæžœã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 - ç‰ä¾¡ãªã‚ªãƒ–ジェクトã¯ç‰ã—ã„ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ï¼ˆConsistent):
equalsメソッドã§ç‰ä¾¡ã¨ã•れる二ã¤ã®ã‚ªãƒ–ジェクトã¯åŒã˜ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’æŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“。ãŸã ã—ã€é€†ã¯å¿…ãšã—ã‚‚æˆã‚Šç«‹ã¡ã¾ã›ã‚“。 - ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã®åˆ†æ•£ï¼ˆDistributed): ç•°ãªã‚‹ã‚ªãƒ–ジェクトã¯ç•°ãªã‚‹ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’æŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“。ãŸã ã—ã€åŒã˜ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã‚ªãƒ–ジェクトãŒå˜åœ¨ã™ã‚‹ã“ã¨ã¯é¿ã‘られã¾ã›ã‚“。
Objects.hashメソッドã¯å¯å¤‰å€‹æ•°ã®å¼•æ•°ã‚’å–りã€ã“れらã®å¼•数を使用ã—ã¦ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’生æˆã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€è¤‡æ•°ã®ãƒ•ィールドを効率的ã«çµ„ã¿åˆã‚ã›ã¦ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’計算ã§ãã¾ã™ã€‚
独自ã®ã‚¯ãƒ©ã‚¹ã‚’作æˆã™ã‚‹éš›ã«ã¯ã€equalsãŠã‚ˆã³hashCodeメソッドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã«ã¤ã„ã¦å分ã«ç†è§£ã—ã€ã“れらをé©åˆ‡ã«å®Ÿè£…ã™ã‚‹ã“ã¨ãŒé‡è¦ã§ã™ã€‚
ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¯”較ã¨ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯ã€Javaプãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã«ãŠã„ã¦ãƒ‡ãƒ¼ã‚¿ã®æ£ç¢ºãªç®¡ç†ã¨åŠ¹çŽ‡çš„ãªæ¤œç´¢ã‚’実ç¾ã™ã‚‹ãŸã‚ã«é‡è¦ãªæ¦‚念ã§ã™ã€‚equalsメソッドã¨hashCodeãƒ¡ã‚½ãƒƒãƒ‰ã®æ£ç¢ºãªå®Ÿè£…ã«ã‚ˆã‚Šã€ã‚ªãƒ–ジェクトã®ç‰ä¾¡æ€§ã‚’確実ã«åˆ¤æ–ã§ãã€ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルãªã©ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ を効果的ã«åˆ©ç”¨ã§ãã¾ã™ã€‚
ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¯”較ã«ãŠã„ã¦ã¯ã€equalsメソッドãŒé©åˆ‡ã«å®Ÿè£…ã•れã¦ã„ã‚‹ã“ã¨ã§ã€ç•°ãªã‚‹ã‚ªãƒ–ジェクトãŒåŒã˜ã¨ã¿ãªã•れãªã„よã†ã«ãªã‚Šã¾ã™ã€‚ã“れã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ¢ãƒ‡ãƒ«ãŒæ£ç¢ºã§ã‚りã€ãƒ—ãƒã‚°ãƒ©ãƒ ã®å‹•作ãŒäºˆæ¸¬å¯èƒ½ã§ã‚ã‚‹ãŸã‚é‡è¦ã§ã™ã€‚
ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã«ãŠã„ã¦ã¯ã€ç•°ãªã‚‹ã‚ªãƒ–ジェクトã«ç•°ãªã‚‹ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’与ãˆã‚‹ã“ã¨ã§ã€åŠ¹çŽ‡çš„ãªæ¤œç´¢ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚hashCodeメソッドã®å®Ÿè£…ã«ãŠã„ã¦ã¯ã€ä¸€è²«æ€§ã¨ç‰ä¾¡ãªã‚ªãƒ–ジェクトãŒç‰ã—ã„ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰ã‚’æŒã¤ã“ã¨ãŒå¤§åˆ‡ã§ã™ã€‚
ã“れらã®åŸºæœ¬çš„ãªåŽŸå‰‡ã‚’ç†è§£ã—ã€å®Ÿéš›ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã§ã“れらã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装ã™ã‚‹ã“ã¨ã§ã€å¯èªæ€§ã®é«˜ã„コードや性能ã®å‘上ã«ã¤ãªãŒã‚Šã¾ã™ã€‚オブジェクト指å‘プãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã«ãŠã„ã¦ã¯ã€ãƒ‡ãƒ¼ã‚¿ã®æ£ç¢ºãªç®¡ç†ãŒã‚½ãƒ•トウェアã®ä¿¡é ¼æ€§ã‚„拡張性ã«å¤§ããªå½±éŸ¿ã‚’与ãˆã‚‹ãŸã‚ã€æ…Žé‡ãªå®Ÿè£…ãŒæ±‚ã‚られã¾ã™ã€‚
「018 オブジェクト指å‘ã®æ·±åŒ–ã€å•題集リスト
🎯 実習ã§ç†è§£ã‚’æ·±ã‚よã†
ã“ã®å†…容ã«ã¤ã„ã¦JavaDrillã§å®Ÿéš›ã«æ‰‹ã‚’å‹•ã‹ã—ã¦å¦ç¿’ã§ãã¾ã™


コメント