প্রতিটি জাভা অবজেক্টের দুটি খুব গুরুত্বপূর্ণ মেথড রয়েছে equals() এবং hashCode() এবং এই মেথডগুলো তাদের নির্দিষ্ট জেনারেল কনট্রাক্ট অনুযায়ী ওভাররাইড করার জন্য ডিজাইন করা হয়েছে। Object ক্লাস সব ক্লাসের পেরেন্ট ক্লাস, এই দুটি মেথডের ডিফল্ট ইমপ্লিমেন্টেশন প্রতিটি ক্লাসে ইতিমধ্যে থাকে। তবে 우리는 প্রয়োজন অনুযায়ী এই মেথডগুলো ওভাররাইড করতে পারি।
hashCode() মেথড
public int hashCode()
এই মেথড একটি ইন্টিজার ভ্যালু রিটার্ন করে, যাকে অবজেক্টের হ্যাশ কোড ভ্যালু বলা হয়। প্রতিটি অবজেক্ট, তৈরির সময় একটি יুনিক 32-বিট, সাইনড int ভ্যালু আਸাইন করা হয়। এই ভ্যালুই সেই অবজেক্টের হ্যাশ কোড ভ্যালু।
hashCode() মেথডের সাথে জেনারেল কনট্রাক্ট
- hashCode() মেথডটি একই অবজেক্টের জন্য একই ইন্টিজার ভ্যালু রিটার্ন করতে হবে এই মেথডটি প্রতিবার কল করলে, যদি না অবজেক্টে স্টোর করা ভ্যালু মডিফাই করা হয়।
- যদি দুটি অবজেক্ট সমান হয় (equals() মেথড অনুযায়ী), তবে hashCode() মেথডটি উভয় অবজেক্টের জন্য একই ইন্টিজার ভ্যালু রিটার্ন করতে হবে।
- তবে, এটি আবশ্যক নয় যে hashCode() মেথডটি অসমান অবজেক্টের জন্য (equals() মেথড অনুযায়ী) আলাদা রেজাল্ট রিটার্ন করবে।
equals() মেথড
public boolean equals(Object obj)
Object ক্লাসের equals() মেথড অবজেক্টদের সমানতা চেক করে এবং তদনুযায়ী true বা false রিটার্ন করে। Object ক্লাস দ্বারা প্রদত্ত ডিফল্ট ইমপ্লিমেন্টেশন, অবজেক্টদের সমানতা চেক করে এই ভিত্তিতে যে দুটি রেফারেন্স একই অবজেক্টকে রেফার করছে কিনা। এটি অবজেক্টের ভ্যালু বা স্টেট চেক করে না। কিন্তু আমরা এই মেথডটি ওভাররাইড করতে পারি নিজস্ব ইমপ্লিমেন্টেশন দিয়ে অবজেক্টের স্টেট বা ভ্যালু তুলনা করার জন্য।
equals() মেথডের সাথে জেনারেল কনট্রাক্ট
যে কোনো নন-নাল রেফারেন্স ভেরিয়েবল a, b এবং c এর জন্য
- a.equals(a) সবসময় true রিটার্ন করা উচিত।
- a.equals(b) true রিটার্ন করা উচিত যদি এবং কেবল যদি b.equals(a) true রিটার্ন করে।
- যদি a.equals(b) true রিটার্ন করে এবং b.equals(c) true রিটার্ন করে তবে a.equals(c) true রিটার্ন করা উচিত।
- a.equals(b) একাধিকবার কল করলে কনসিস্টেন্টলি true বা কনসিস্টেন্টলি false রিটার্ন করা উচিত যদি অবজেক্টের ভ্যালু কোনো তরফে মডিফাই না হয়।
- a.equals(null) false রিটার্ন করা উচিত।
সুতরাং equals() মেথড ওভাররাইড করলে hashCode() মেথডও ওভাররাইড করা আবশ্যক।
উদাহরণ
public class MainClass {
public static void main(String[] args) {
MainClass mainClass = new MainClass();
TestClass obj1 = new TestClass(1);
TestClass obj2 = new TestClass(1);
mainClass.test1(obj1, obj2);
TestClass obj3 = new TestClass(1);
TestClass obj4 = new TestClass(2);
mainClass.test2(obj3, obj4);
}
public void test1(TestClass obj1, TestClass obj2) {
if (obj1.equals(obj2)) {
System.out.println("Object One and Object Two are equal");
} else {
System.out.println("Object One and Object Two are not equal");
}
}
public void test2(TestClass obj3, TestClass obj4) {
if (obj3.equals(obj4)) {
System.out.println("Object Three and Object Four are equal");
} else {
System.out.println("Object Three and Object Four are not equal");
}
}
}
class TestClass {
private int val;
TestClass(int val) {
this.val = val;
}
public int getValue() {
return val;
}
@Override
public boolean equals(Object o) {
// null check
if (o == null) {
return false;
}
// this instance check
if (this == o) {
return true;
}
// instanceof Check and actual value check
if ((o instanceof TestClass) && (((TestClass) o).getValue() == this.val)) {
return true;
} else {
return false;
}
}
@Override
public int hashCode() {
int result = 0;
result = (int) (val / 11);
return result;
}
}
আউটপুট
Object One and Object Two are equal Object Three and Object Four are not equal