عملية sameCard
كلمة "same" أو "نفس" هي أحد الأشياء التي تطرأ في اللغة الطبيعية وتبدو واضحة تماماً حتى تفكر فيها قليلاً، وعندها ستستنتج أنها تملك أكثر مما تتوقعه منها.
مثلاً، لو قلت "أنا وكريس نملك نفس السيارة"، فأنا أعني أن سيارتينا من نفس الماركة والموديل، لكنهما سيارتين مختلفتين. لو قلت "أنا وكريس لنا نفس الأم"، فأنا أعني أن أمنا هي امرأة واحدة. لذا فإن فكرة "التطابق" تختلف اعتماداً على السياق.
عندما تتكلم عن الكائنات، يوجد غموض مشابه. مثلاً، إذا كانت ورقتين (two Cards) متطابقتين، فهل يعني هذا أنهما يحويان نفس البيانات (الرتبة والمنظومة)، أو أنهما فعلاً كائن Card وحيد؟
لنتحقق فيما إذا كان مرجعين يشيران إلى نفس الكائن، نستخدم عامل ==. مثلاً:
كود:
Card card1 = new Card(1, 11);
Card card2 = card1;
 
if (card1 == card2) {
System.out.println("card1 and card2 are identical.");
}
المرجعيات التي تشير إلى نفس الكائن متطابقة (identical). أما المرجعيات التي تشير إلى كائنات تحوي نفس البيانات فهي متساوية (equivalent).
من الشائع كتابة عملية للتحقق من المساواة، وتدعى باسم مثل sameCard.
كود:
public static boolean sameCard(Card c1, Card c2) {
return(c1.suit == c2.suit && c1.rank == c2.rank);
}
هذا مثال ينشئ كائنين لهما نفس البيانات، ويستعمل sameCard ليرى إذا كانا متساويين:
كود:
Card card1 = new Card(1, 11);
Card card2 = new Card(1, 11);
if (sameCard(card1, card2)) {
System.out.println("card1 and card2 are equivalent.");
}
إذا كان المرجعين متطابقين، فهما متساويين أيضاً، لكن إذا كانا متساويين، فليس بالضرورة أن يكونا متطابقين.
في هذه الحالة، card1 وcard2 متساويين لكنهما غير متطابقين، لذا سيبدو مخطط الحالة كهذا:
http://file.topmaxtech.net/images/ph...3961871321.jpg
كيف سيدو مخطط الحالة لو كان card1 وcard2 متطابقين؟
في القسم 8.10 أخبرتك ألا تستعمل == مع السلاسل المحرفية لأنه لن يعطيك ما تتوقعه منه. بدلاً من مقارنة محتويات السلسلتين (المساواة)، سيتحقق فيما إذا كانت السلستين نفس الكائن (المطابقة).