اختبار المساواة في جافا (Equality Testing)
بسم الله الرحمن الرحيم
اختبار المساواة والذي نطبقه غالبا باستخدام "== " لتأكد من تساوي البيانات التي نود التحقق منها
غير أن هذه المقارنة لا تتم دائما كما نتوقع ولنبدأ بالتجربة والتأكد والتعليل
في البداية لدينا هذا الكود
int a = 5 ;
int b = 5 ;
System.out.print(a==b);
ونتيجة هذه المقارنة تبدو واضحة جدا حيث يقوم compiler بالقيام بعملية المقارنة وإرجاع true or false حسب النتيجة
لكن هذا لا يكون إلا في حال كان نوع البيانات التي نتعامل معها هو primitive data types بمعنى أن المقارنة بهذه الطريقة مع object type ستكون نتيجتها مختلفة تمام عن المتوقع
ولنأخذ هذا المثال
Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a == b);
قد تفاجأ حين تظهر لك نتيجة هذه المقارنة false ولكن يعود السبب في هذه النتيجة أنه عندما تنشئ متغير من نوع object فأنت لا تسند له القيمة و إنما المرجع (reference)
ففي المثال السابق لا تتم المقارنة بهذه الصورة (5 ==5 ) و إنما نقول تجوزا بهذه الصورة (0x24 == 0x33) فالمقارنة على تتم علىobject reference و ليست على قيمة object
إذا مالحل ؟
الحل هو استخدام equals method كما في المثال التالي
Integer a = new Integer(5);
Integer b = new Integer(5);
System.out.println(a.equals(b));
فنتيجة هذه المقارنة ستكون true حيث أن equals method ستقوم بمقارنة القيم وتعطي نتائج سليمة
إذا هل استخدم equals method مع جميع المتغيرات من نوع object ؟
الجواب لا , ف equals method هي من class object وهذا class هو superclass لجميع classes في java
إذا ف equals method ستورث لأي class ينشأ, لكن في حال لم يتم عمل override لها داخل class فلن تعطيك نتائج سليمة
ولنأخذ هذا المثال
String a = new String ("test");
String b = new String ("test");
StringBuilder c = new StringBuilder("test");
StringBuilder d = new StringBuilder("test");
System.out.println("String: "+a.equals(b));
System.out.println("StringBuilder: "+c.equals(d));
فسيكون output كالتالي
String: true
StringBuilder: false
و السبب يعود كما أسلفت لأنه في class String تم عمل override ل equals method وهذا لم يتم في StringBuilder class
ويمكنك التأكد من هنا
String : https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals(java.lang.Object)
StringBuilder : https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html
جميل جداً وهذا يقودنا إلى تساؤل , كيف يمكن أن أعمل override ل equals method داخل class الذي أنشأته ؟
لنأخذ هذا المثال لنفرض أن لدينا class اسمه Student وفيه two data member وهما name & address
public class Student {
String name ;
String address ;
//constructor
Student (){
name = "abdulaziz" ;
address = "riyadh" ;
}
//override of equals method in our class
public boolean equals (Object other){
boolean result = false ;
if(other instanceof Student){
Student S2 = (Student)other ;
result = S2.name.equals(this.name)
&& S2.address.equals(this.address) ;
}
return result ;
}
public static void main(String[] args)
{
Student a =new Student() ;
Student b =new Student();
System.out.println(a.equals(b));
}
}
فكما نشاهد في هذا المثال فقد تم عمل override ل equals method واستخدامها داخل class الذي قمنا بإنشائه
نقطة أخيره أختم بها هذه المقالة لا يمكن استخدام equals method مع null object وإلا ستحصل على java.lang.NullPointerException كما في هذا المثال
Student a =null ;
Student b =null;
System.out.println(a.equals(b));
وختاما إن وفقت في الطرح والمعلومات فمن الله وإن أخطأت فمن نفسي والشيطان
والسلام عليكم ورحمة الله وبركاته
المصادر:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !