لمحة جافاوية 52: الكائنات المتكافئة

السلام عليكم

هاي يا شباب
يجب أن أبدو بمظهر الشب العصري
وأوزع على الناس الهايات (جمع هاي)
سبحان الله يا أخي وكأن الإنسان الذي يقول السلام عليكم
مجرد متخلف عقلياً
مع أن السلام عليكم تحمل بين طياتها الكثير من المعاني الجميلة
لكن صدق الصادق المصدوق عليه أفضل الصلاة والسلام
“لو دخلوا جحر ضب لدخلتموه”
منورنا يا أخ عبده هل تريد أن تقدم الدرس اليوم
-بالطبع لا فلم أقوم بتحضير أي شيء-
اذن هل تتحفنا بسكوتك التام
-ماذا تقصد بالضبط؟-
أقصد أني أحب منظرك وأنت ساكت يجعلني أحس أن الدنيا مازالت بخير
-شكراً على المجاملة اللطيفة ولو أنها من شخص غير لطيف بالمرة-
لا أدري لماذا تحب أن تكسر مجاديفي دائماً لكن لا يسعني غير أن أسكت
دعونا من كل هذا الكلام ولنتحدث عن أية مواضيع مفيدة
في المرة السابقة تكلمنا عن المجموعات وعن كونها شيء جميل جداً
في مثالنا السابق استطاعت الجافا معرفة أن alaa=alaa
ما رأيكم أن نجرب على كائن من صنعنا
سنقوم بعمل فئة اسمها OurObject ونجرب عليها

public class OurObject {
	private String ourData;

	public OurObject(String ourData) {
		this.ourData = ourData;
	}
	
}

الأن دعنا نكتب شيفرة بسيطة للفحص

import java.util.HashSet;

public class Test {
	public static void main(String[] args) {
		HashSet hashSet=new HashSet();
		OurObject ourObject1=new OurObject("data");
		OurObject ourObject2=new OurObject("data");
		hashSet.add(ourObject1);
		hashSet.add(ourObject2);
		for (OurObject ourObject : hashSet) {
			System.out.println(ourObject);
		}
	}
}

مممممممممممممم يفترض أن الكائنات ourObject1 و ourObject2 متكافئان لأنهما من نفس النوع ولهما نفس الصفات fields
لكن الجافا لم تفهم هذا أبداً ونلاحظ أنها طبعت قيمتين في التكرار
مممممممممممممم
لماذا لم تفهم الجافا بالنسبة لفئتنا وفهمت الأمر بالنسبة للفئة String
لأن String لديها تكنيك خاص بها

الجافا لديها فكرة مبدئية أن أي كائن يختلف عن الآخرين وذلك بالنسبة لموقعه في الذاكرة
لو أردنا تغيير هذه الفكرة فإننا يجب أن نعرف مصدر هذه الفكرة
مصدر هذه الفكرة هو كون أي فئة في الجافا ترث الفئة كائن بشكل غير مباشر
والفئة كائن تضم بين جنباتها الدالة equals
-مللنا منك يا ثقيل الدم-
بأمانة لو لم تكف عن إزعاجاتك المتكررة سأوقف الموضوع يا أخ عبده
ما رأيك أن تكتب بدلاً مني وتكف عن إزعاجي؟
-لا أجد وقتاً للكتابة-
إذن كف عن الكلام واتركني وشأني
نكمل ما كنا قد بدأناه
إذن يجب علينا أن نعيد كتابة الدالة equals لكي نضمن أن الجافا تستطيع فهمنا

public class OurObject {
	private String ourData;

	public OurObject(String ourData) {
		this.ourData = ourData;
	}
	@Override
	public boolean equals(Object obj) {
		if(ourData.equals(((OurObject)obj).ourData)){
			return true;
		}
		else
			return false;
	}
}

-نفس المشكلة يا حيوان ألن تكف عن محاولة الظهور بمظهر العالم-
لأجلك يا أخ عبده لن أكمل الموضوع اليوم
-هل تهددني يا حيوان؟؟ طرااااااااااااااخ-
بالطبع لا يا أخ عبده أنا أعتذر
سنكمل الموضوع بالطبع بقيت المشكلة قائمة لأن المجموعة التي نستخدمها تعتمد على على التركيب HashTable
يجب علينا التنبيه على أن تركيب البيانات HashTable
يعتمد على أن تكون القيمة الخاصة بالكائنين متساوية
من أين تأتي الجافا بهذه القيمة؟
الجافا تأتي بها من الدالة hashCode الموجودة في الفئة كائن
لهذا يجب علينا أن نقوم بإعادة كتابتها هي أيضاً
لتصبح الفئة الخاصة بنا كالتالي

public class OurObject {
	private String ourData;

	public OurObject(String ourData) {
		this.ourData = ourData;
	}
	@Override
	public boolean equals(Object obj) {
		if(ourData.equals(((OurObject)obj).ourData)){
			return true;
		}
		else
			return false;
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return ourData.hashCode();
	}
}

الآن جرب الشيفرة التي كتبناها للفحص مرة أخرى
أووووووووه إنها تعمل على رأي الحج أيمن أبوسمرة (أيمن الطالب) سحر
(إن كنتم لا تعرفون أيمن أبوسمرة فتجاهلوا الموضوع وكأنكم لم ترو اسمه)
يمكننا اختصار الكلام السابق كله في السؤال التالي:
ما الخطوات التي يجب أن أقوم بها لأجعل الجافا تعرف أن كائنين من الفئة الخاصة بي متكافئين؟
1- قم بإعادة كتابة (override) الدالة equals
2- قم بإعادة كتابة الدالة hashCode
2- اسمتمع :)

شكر خاص للمهندس محمد الخضري الذي أفادني في موضوع hashCode
هناك شخص آخر أريد أن أقتله لكني لن أذكر اسماً لأني لا أضمن عواقب ذكر الاسم

تحياتي

Tags: , , , , , , ,

2 Responses to “لمحة جافاوية 52: الكائنات المتكافئة”

  1. radio moon قال:

    Thank you verey much for the beneficial informatin .

    thanks.. good look

  2. admin قال:

    you are welcome

Leave a Reply