תוכנה 1 בשפת Java. תזכורת: המחלקה Object מה יודפס? החוזה של equals הבעיה. equals, hashcode and wildcards. רצינו השוואה לפי תוכן אבל לא דרסנו את equals - PDF

Description
תוכנה 1 בשפת Java equals, hashcode and wildcards 1 מה יודפס? תזכורת: המחלקה Object package java.lang; public class Object { public final native Class getclass(); public native int hashcode(); return

Please download to get full document.

View again

of 5
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Information
Category:

Recipes/Menus

Publish on:

Views: 32 | Pages: 5

Extension: PDF | Download: 0

Share
Transcript
תוכנה 1 בשפת Java equals, hashcode and wildcards 1 מה יודפס? תזכורת: המחלקה Object package java.lang; public class Object { public final native Class ? getclass(); public native int hashcode(); return (this == obj); protected native Object clone() throws CloneNotSupportedException; public String tostring() { return getclass().getname() + + Integer.toHexString(hashCode()); List Name names = new ArrayList Name (); false false 3 4 החוזה של equals הבעיה רצינו השוואה לפי תוכן אבל לא דרסנו את equals מימוש ברירת המחדל הוא השוואה של מצביעים public class Object { return (this == obj); 5 יחזיר true אמ מ y.equals(x) יחזיר true מחזיר true וגם y.equals(z) מחזיר true רפלקסיבי true יחזיר x.equals(x) סימטרי x.equals(y) טרנזיטיבי אם x.equals(y) אז x.equals(z) עקבי סדרת קריאות ל x.equals(y) תחזיר true )או )false באופן עקבי אם מידע שדרוש לצורך ההשוואה לא השתנה השוואה ל null false תמיד תחזיר x.equals(null) 6 1 טעות נפוצה מתכון ל equals להגדיר את הפונקציה equals כך: if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass())) return false; Name other = (Name) obj; 1. ודאו כי הארגומנט אינו מצביע לאובייקט הנוכחי return first.equals(other.first) && last.equals(other.last); )overriding( אלא העמסה 2. ודאו כי הארגומנט אינו null 3. ודאו כי הארגומנט הוא מהטיפוס המתאים להשוואה 4. המירו את הארגומנט לטיפוס הנכון 5. לכל שדה משמעותי , בידקו ששדה זה בארגומנט תואם לשדה באובייקט הנוכחי public boolean equals(name name) { return first.equals(other.first) && last.equals(other.last); זו אינה דריסה )overloading( שימוש יפתור את הבעיה 7 8 כמעט אז הכל public equals(object obj) public equals(object obj) { List Name names = new ArrayList Name (); Set Name names = new HashSet Name (); יודפס false 9 10 החוזה של hashcode hashcode ו equals חובה לדרוס את hashcode בכל מחלקה שדורסת את!equals עקביות מחזירה אותו ערך עבור כל הקריאות באותה ריצה, אלא אם השתנה מידע שבשימוש בהשוואת equals של המחלקה שוויון אם שני אובייקטים שווים לפי הגדרת equals אזי hashcode תחזיר ערך זהה עבורם חוסר שוויון אם שני אובייקטים אינם שווים לפי equals לא מובטח ש hashcode תחזיר ערכים שונים החזרת ערכים שונים יכולה לשפר ביצועים של מבני נתונים המבוססים על hashing )לדוגמא, HashSet ו )HashMap מימוש public int hashcode() { return 31 * first.hashcode() + last.hashcode(); השתדלו לייצר hash כך שלאובייקטים שונים יהיה ערך hash שונה תמיכה באקליפס אקליפס תומך ביצירה אוטומטית )ומשולבת( של hashcode ו equals בתפריט Source ניתן למצוא Generate hashcode() and equals() המימוש החוקי הגרוע ביותר )לעולם לא לממש public int hashcode() { return 42; String[] as = new String[10]; Object[] ao = as; מערכים ורשימות האם הקוד הבא מתקמפל? List String ls = new ArrayList String (10); List Object lo = ls; וזה? 15 Super אז Sub[] הוא Sub[] sub = Super[] sup = sub; תזכורת מערכים הם קו-וריאנטים אם Sub הוא תת-טיפוס של תת-טיפוס של Super[] טיפוסים גנריים הם וריאנטים אם T1 ו T2 טיפוסים שונים אז, לדוגמה, בין הטיפוסים List T1 ו List T2 לא מתקיים יחס של תתי- טיפוסים גם אם יחס כזה מתקיים בין T1 ו T2 List T1 sub = new ArrayList T1 (); List T2 sup = sub; 16 משימה נממש פונקציה המדפיסה את כל האברים שבאוסף static void printcollection(collection object c) { האם ניתן להעביר לפונקציה List String כפרמרטר? List String ls = new ArrayList String (); // populate list printcollection(ls); נרצה פונקציה שמקבל collection של כל טיפוס 17 האמא של כל ה- Collections טיפוס העל של כל האוספים הוא: Collection ? - collection of unkown זהו אוסף שטיפוס האברים שבו מתאים להכל הטיפוס של האברים נקרא wildcard type מסיבות ברורות static void printcollection(collection ? c) { 18 3 שימושים כשלא יודעים או לא אכפת לנו מהו הטיפוס האמיתי לדוגמא, פונקציות הפועלות על מבנה של collection )shuffle, rotate, ( static int numberofelementsincommon(set ? s1, Set ? s2) { int result = 0; for (Object o : s1) { if (s2.contains(o)) result++; return result; 19 מחסנית public Stack() public void push(e e) { public E pop() { public boolean isempty() { public void pushall(collection e src) { for (E e : src) push(e); נתונה המחלקה: נרצה להוסיף מה הבעיה במימוש? 20 Unbounded Wildcard static void printcollection(collection ? c) { תמיד נוכל לקרוא איברים ולהתייחס אליהם כ - Object Collection ? ls = new ArrayList String (); c.add(new Object()); הבעיה מכיוון שאיננו יודעים מה טיפוס האברים באוסף c לא ניתן להוסיף אלמנטים. כל אובייקט שנעביר כפרמטר ל- add חייב להיות מתת-טיפוס של האבר, אבל איננו יודעים מהו טיפוס האבר. החריג היחיד הוא null מה קורה עבור הקוד הבא: זיכרו Integer יורש מ Number Stack Number numberstack = new Stack Number (); Collection Integer integers = numberstack.pushall(integers); הודעת שגיאה The method pushall(collection number ) in the type Stack Number is not applicable for the arguments (Collection Integer ) ממה נובעת הודעת השגיאה? 21 22? extends E טיפוס הקלט ל pushall במקום E Collection of נרצה Collection of some subtype of E public void pushall(collection ? extends E src) { for (E e : src) push(e); חסם עליון על טיפוס הקלט E הוא תת טיפוס של עצמו popall כעת נרצה להוסיף את popall public void popall(collection e dst) { while (!isempty()) dst.add(pop()); בעיית קומפילציה? מה עם קוד הלקוח? 23 4 קוד הלקוח האם יש בעיה בקוד הלקוח? Stack Number numberstack = new Stack Number (); Object o = numberstack.pop(); Collection Object objects = numberstack.popall(objects); האם השימוש ב extend מתאים גם פה?? super E טיפוס הקלט ל popall במקום E Collection of נרצה Collection of some supertype of E public void popall(collection ? super E dst) { while (!isempty()) dst.add(pop()); חסם תחתון על טיפוס הקלט E הוא תת טיפוס של עצמו 26 get-put principal* השתמשו ב extends כאשר אתם קוראים נתונים ממבנה, ב super כאשר אתם מכניסים נתונים למבנה ואל תשתמשו ב wildcards כאשר אתם עושים את שניהם ב pushall קוראים נתונים מהמשתנה src ב popall מכניסים נתונים למשתנה dst סיכום Wildcards שלושה סוגים של :wildcards? קבוצת כל הטיפוסים או טיפוס לא ידוע כלשהו ? extends T משפחת תתי הטיפוס של T )כולל T(? super T משפחת טיפוסי העל של T )כולל T( * Java Generics and Collections by Naftalin and Wadler 5
Related Search
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks