בהמשך לטיפים של השבוע,
ראינו מה זה Equals ואיך אמורים לממש אותו.
כעת נדבר קצת על האופרטור ==.
כאמור, זוהי מתודה סטטית, ולכן קריאה אליה היא יחסית מהירה.
בקשר למימוש הדיפולטי שלה:
עבור value types אין מימוש דיפולטי
עבור reference type המימוש הדיפולטי הוא השוואת referenceים.
קיימות שתי דרכים פופולאריות לממש אותו:
- להשאיר דיפולטי של השוואת Referenceים
- להחליף את המימוש בקריאה לEquals של האובייקט.
נרצה לעשות את האופציה השנייה בד”כ במקרים הבאים:
- בvalue types – מאחר ואחרת לא נוכל להשתמש באופטור
- בreference types – כאשר מדובר באובייקט immutable (שאינו בר שינוי), כיוון שאז שוויון של שני אובייקטים הוא שוויון קבוע. למשל, בstring מומש האופרטור == ע”י קריאה לEquals, גם אם שני הstringים אינם מצביעים לאותו reference.
שימו לב שמימוש של האופרטור ==, דורש גם מימוש של האופרטור =!.
ביכולתנו לממש אותו כאוות נפשנו. למרות זאת, נעדיף בד”כ לממש אותו בצורה הטריוויאלית:
|
|
אלא אם כן נרצה לעשות משהו מוזר.
אמרנו בתחילת השבוע שלא תמיד Equals ו== הם זהים.
נראה כעת מקרה בו מומשו גם Equals וגם ==, עם זאת המימוש שונה.
למחלקה double יש מימוש לEquals ול==. הם בד"כ מזדהים:
|
|
אבל יש מקרים יוצאי דופן:
|
|
ההיגיון אומר את הדבר הבא:
NaN (Not a number) הוא לא מספר, ולכן אינו זהה לאף מספר אחר
לכן גם אינו זהה לעצמו.
מצד שני, לשני NaNים שונים, יש אותו "ערך" ולכן הם שווים מבחינת Equals.
סופ"ש שווה!