اختبار المساواة في جافا (Equality Testing)

3zcsمنذ 7 سنوات

بسم الله الرحمن الرحيم

اختبار المساواة والذي نطبقه غالبا باستخدام "== " لتأكد من تساوي البيانات التي نود التحقق منها

غير أن هذه المقارنة لا تتم دائما كما نتوقع ولنبدأ بالتجربة والتأكد والتعليل

في البداية لدينا هذا الكود


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

كلمات دليلية:
1
إعجاب
7150
مشاهدات
0
مشاركة
2
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !