عملية equals

في القسم 13.4 تحدثنا عن مفهومين للتكافؤ: التطابق، وهو يعني أن المتغيرين يشيران إلى نفس الكائن، والمساواة، التي تعني أن للمتغيرين القيمة نفسها.
يختبر عامل == التطابق، ولا يوجد عامل لاختبار المساواة، لأن تعريف "المساواة" يعتمد على نوع الكائن. بدلاً من ذلك، تملك الكائنات عملية تدعى equals تعرّف مساواة الكائنات.
توفر أصناف Java عمليات equals التي تنفذ عمليات المقارنة بالشكل الصحيح، لكن بالنسبة للأنواع التي يعرفها المستخدم يكون تعريف العملية الافتراضي نفس تعريف التطابق، وهو ما لا تريده عادة.
بالنسبة لكائنات Card فقد كتبنا مسبقاً عملية تتحقق من المساواة:
كود:
public static boolean sameCard(Card c1, Card c2) {
   return (c1.suit == c2.suit && c1.rank == c2.rank);
}
لذا كل ما علينا فعله هو إعادة كتابتها بشكل عملية كائنية:
public boolean equals(Card c2) {
   return (suit == c2.suit && rank == c2.rank);
}
لقد أزلت الكلمة static والمعامل الأول c1. هذه هي كيفية استدعاء هذه العملية:
كود:
Card card = new Card(1, 1);
Card card2 = new Card(1, 1);
System.out.println(card.equals(card2));
داخل equals، يكون card هو الكائن الحالي وcard2 يكون المعامل c2. بالنسبة للعمليات التي تعمل على كائنين من نفس النوع، أحياناً أستخدم الكلمة this صراحة وأدعو المعامل الثاني that:
كود:
public boolean equals(Card that) {
   return (this.suit == that.suit && this.rank == that.rank);
}
أعتقد أن هذا يجعل فهم العملية أسهل.

تمرين 15.1

نزّل http://thinklikecs.webs.com/resource...CardSoln2.java و
http://thinklikecs.webs.com/resource...CardSoln3.java.
يحتوي CardSoln2 على حلول تمارين الفصل السابق. وهو يستخدم عمليات الأصناف فقط (ما عدا العمليات البانية).
يحتوي CardSoln3 على نفس البرامج، لكن معظم العمليات أصبحت كائنية. لقد تركت merge كما هي لأنني أعتقد أنها أسهل للفهم كعملية صنف.
حول merge إلى عملية كائنية، وغير mergeSort وفقاً لذلك. أي نسخة من merge أفضل؟