JavaRush /בלוג Java /Random-HE /15 שאלות ראיון למפתחים לגבי Enum ב-Java (עם תשובות!)
Treefeed
רָמָה

15 שאלות ראיון למפתחים לגבי Enum ב-Java (עם תשובות!)

פורסם בקבוצה
ספירה ( Enum ) הוצגה ב- Java 5 ומאז היא הפכה פופולרית למדי בקרב מפתחי Java. הוא נמצא בשימוש נרחב ביישומי ג'אווה שונים. מכיוון ש-Enum ב-Java הוא הרבה יותר תכליתי מאשר ב-C או C++, הוא גם מציג הרבה מקרי שימוש מעניינים, שכמה מהם ראית במאמר 10 דרכים להשתמש ב-Enum ב-Java . אך למרות הפופולריות הזו, מתכנתי ג'אווה רבים עדיין אינם מודעים לפונקציונליות שמספקת Enum ולמורכבות השימוש ב-Enum בקוד ג'אווה. זה התברר מכמה קוראים ששאלו, למשל, על היכולת של Enum ליישם ממשק ב-Java או למה אנחנו לא יכולים ליצור Enums מחוץ ל-Enum , וציין שהם נשאלו על כך בראיון. זה נתן לנו השראה להרכיב רשימה של שאלות נפוצות ב-Java Enum שלא רק עוזרות לך להצליח בראיונות, אלא גם פותחות אפיקים חדשים ללמידה. כפי שצוין קודם לכן, לעתים קרובות שאלות ראיונות מאלצות אותך לקחת את הנושא ברצינות רבה יותר, וזה לא דבר רע, ובהתחשב בעוצמה והתועלת של Enum, הגיע הזמן שתהפוך למאסטר ה-enum. להלן רשימת שאלות המבוססת על פונקציונליות ומאפיינים שונים של Enum. אתה יכול להשתמש בו כחומר הכנה לראיון או סתם מדריך לספירה. אם אתה חדש ב-Java, תלמד הרבה דברים חדשים ושימושיים על Enum. 1) האם Enum יכול ליישם ממשק ב-Java? כן, Enum יכול לרשת ממשקים . מכיוון שסוג ה-Enum דומה למחלקה ולממשק , הוא יכול לרשת ממשק. זה נותן גמישות מדהימה בשימוש ב-Enum כיישום מותאם אישית במקרים מסוימים. הנה דוגמה טובה לשימוש ב-Enum בתפקיד זה. 2) האם Enum יכול לרשת (להרחיב) מחלקה? לא הוא לא יכול! לא צפוי, מאחר שנאמר בעבר שסוג ה-Enum דומה למחלקה או ממשק ב-Java. ובכן, זו הסיבה העיקרית לכך שהשאלה הזו נשאלת מיד אחרי הקודמת. מכיוון ש- Enum כבר יורש מהמחלקה המופשטת java.lang.Enum , ברור שמחלקה אחרת לא תוכל לרשת מאחר ש-Java לא תומכת בירושה של מחלקות מרובות. על ידי ירושה מ- java.lang.Enum , לכל ה-enums יש מתודות ordinal() , values() או valueOf() . 3) כיצד ליצור Enum ללא מופעי אובייקט? האם זה אפשרי ללא שגיאת קומפילציה? זו אחת השאלות המסובכות שמראיינים אוהבים. מכיוון ש-Enum נתפס כאוסף של מספר מסוים של אובייקטים, כמו ימי השבוע או חודשי השנה, קבלת Enum ללא שום דבר נראה חשוד. אבל כן, אתה יכול ליצור Enum ללא מופעים , למשל על ידי יצירת מחלקת עזר. זוהי דרך חדשנית נוספת להשתמש ב-Enum: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) האם נוכל לעקוף את שיטת toString() עבור Enum? מה יקרה אם לא נגדיר מחדש? כמובן שאתה יכול לעקוף את שיטת toString() של Enum , כפי שאתה יכול לעקוף כל מחלקה שיורשת את java.lang.Object ושיש לה מתודה toString() זמינה, וגם אם לא, לא תפסיד שום דבר בגלל המופשט base של מחלקת Enum יעשה זאת עבורך, ויחזיר את השם, שהוא השם של המופע של Enum. הנה הקוד של שיטת toString() מהמחלקה Enum: public String toString() { return name; } name מצוין כאשר המהדר מקצה קוד ליצירת enum בתגובה ליצירת מופע במחלקה Enum עצמה, כמו גם יצירת ordinal בקונסטרוקטור מה- מחלקה java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } זהו הבנאי היחיד ליצירת enum , אשר נקרא על ידי המהדר בתגובה להכרזה על Enum בתוכנית. 5) האם אנו יכולים ליצור Enum מחוץ ל-Enum? למה לא? אתה לא יכול ליצור Enum מחוץ לגבולות של Enum כי ל-Enum אין ציבורconstructor, והמהדר לא יאפשר לך להציג אף בנאי כזה. מכיוון שהמהדר מייצר את רוב הקוד בתגובה להצהרה מסוג Enum, הוא אינו מאפשר לבנאים ציבוריים בתוך Enums, מה שמאלץ מופעי Enum להיות מוצהרים פנימיים. 6) האם נוכל לציין בנאי בתוך Enum? שאלה זו באה לרוב בעקבות השאלה הקודמת. כן, אתה יכול, אבל זכור שזה אפשרי רק עם בנאים פרטיים או חבילות פרטיות . בנאים עם ציבוריים ומוגנים אינם מורשים ב-Enum. כאן אתה יכול לראות דוגמה . 7) מה ההבדל בין השוואה של Enum באמצעות שיטת == או equals()? זהו נושא מאוד רחב ובעייתי שמכוסה בפירוט כאן . 8) מה עושה השיטה ordinal() ב-Enum? השיטה ordinal() מחזירה את הסדר שבו מופעי Enum מוגדרים בתוך ה-Enum. לדוגמה, ב- DayOfWeek Enum, ניתן לציין את הימים לפי הסדר: ואם נקרא לשיטת DayOfWeek.MONDAY.ordinal() , היא תחזיר 0 - כלומר המופע הראשון. שיטה זו שימושית מאוד למתן סדר לפי מצב הדברים בפועל: כלומר, מציינת שיום שלישי (שלישי) מגיע אחרי שני (שני), ולפני רביעי (רביעי). באופן דומה, אתה יכול להשתמש בספירה כדי לייצג חודשים בשנה, כאשר פברואר מגיע אחרי ינואר אבל מגיע לפני מרץ. כל הספירות המותאמות אישית יורשות את השיטה הזו מהמחלקה המופשטת java.lang.Enum , והן נקבעות על ידי המהדר על ידי קריאה לבנאי המוגן ב- java.lang.Enum , אשר לוקח שם ואורדינל. 9) האם ניתן להשתמש ב-Enum עם TreeSet או TreeMap ב-Java? זו שאלת Enum מעניינת באמת, ואחת שאנשים אוהבים לשאול כדי לבדוק את עומק הידע שלהם. עד שתסתכל על הקוד java.lang.Enum , כנראה שלא תדע ש- Enum יורש את ממשק Comparable , שהוא דרישת מפתח לשימוש באוספים מסודרים כמו TreeSet ו- TreeMap . מכיוון ש-Enum יורש את ממשק Comparable כברירת מחדל , ניתן להשתמש בו עם TreeSet ו- TreeMap . 10) מה ההבדל בין ordinal() לבין compareTo() ב-Enum? זה נובע ישירות מהשאלה הקודמת: למעשה, compareTo() מדמה את הסדר שמספקת השיטה public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } ordinal() , שהוא הסדר הטבעי של Enum. בקיצור, Enum מגבילה השוואות לפי סדר ההכרזה. כמו כן, כדאי לזכור שקבועים אלו ניתנים להשוואה רק לקבועים אחרים מאותו סוג – השוואה בין סוגי קבועים שונים עלולה להוביל לטעות מהדר. 11) האם ניתן להשתמש ב-Enum במארז מתג? כן אתה יכול. יתרה מכך, זהו אחד היתרונות העיקריים של השימוש ב-Enum. מכיוון שמופעי Enum קומפילים לקבוע זמני, אתה יכול להזריק אותם בבטחה למארז ולהחליף . הנה דוגמה לקוד עם ימי שבוע: public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum ו-Switch משלימים זה את זה היטב, במיוחד אם ה-Enum מכיל מספר קטן של קבועים יציבים, למשל, שבעה ימים בשבוע, 12 חודשים בשנה, וכו'. דוגמאות אחרות לשימוש ב-swith case עם Enum . 12) איך לחזור על מופע שלם של Enum? אם פתחת את java.lang.Enum , אתה יודע שמתודה values() מחזירה מערך של כל קבועי Enum. מכיוון שכל enum יורש את java.lang.Enum , יש להם שיטה values() . באמצעותו, ניתן לחזור על כל הקבועים של ספירה מסוג מסוים. תסתכל על דוגמאות של זה עובר עם לולאה קדמית ומתודה values() . 13) מהם היתרונות והחסרונות של שימוש ב-Enum כסינגלטון? Enum מספק קיצור דרך מהיר ליישום דפוס הסינגלטון, ומכיוון שהוא אפילו מכוסה בספר האפקטיבי של Java, זו בחירה פופולרית. במבט ראשון, הסינגלטון של Enum מבטיח ודי נוח, כמו למשל שהוא שולט באינסטציה, ניתן לסידרה בצורה מאובטחת, ומעל לכל, קל ליצור יחידה בטוחה לחוטים באמצעות Enum. אינך צריך עוד לדאוג לגבי בדיקה כפולה של התנודתיות של משתנים. קרא עוד על היתרונות והחסרונות של שימוש בגישה זו כאן . 14) מה היתרון בשימוש ב-Enum במקום ב-int enumeration ובדפוסי ספירת מחרוזת? אם אתה מתכנת יותר מ-5 שנים ועדיין נמצא ב-JDK 1.3 או 1.4, תכיר את דפוסי ספירת המחרוזות וה-int , המשתמשות בקידומת קבועה סופית סטטית ציבורית כדי לייצג אוסף של קבועים ידועים. מספר דברים, כמו ימי השבוע . יש כאן הרבה בעיות: אין לך עצמאות מסוג Enum, שכן המשתנה String האחראי ליום בשבוע יכול לקבל כל ערך שרירותי. באופן דומה, אינט ספור יכול לקבל כל ערך, והמהדר יבלע אותו בשמחה. ומשתמש Enum , אתה מקבל את בטיחות הסוג שהמהדר בודק עבורך. יש כמה מחשבות מעניינות בנושא זה ב- Effective Java, שמומלץ לקרוא לכל מפתחי Java. 15) כיצד להמיר מחרוזת ל-Enum? זוהי שאלה יומיומית שעולה עקב הפופולריות של השימוש ב-String ו- Enum בפיתוח יישומי Java. הדרך הטובה ביותר להמיר Enum למחרוזת היא להגדיר שיטת factory ב-Enum עצמה שתיקח ארגומנטים של String ותחזיר אותה כ- Enum . ייתכן שתרצה גם להתעלם מהמקרה. הנה כמה דוגמאות להפיכת מחרוזות לספירות. זה מביא אותנו לסוף הרשימה שלנו של 15 שאלות ( ותשובות ) על Enum. אבל זכרו: קריאה אינה מספיקה כדי ללמוד, היא רק הצעד הראשון . כדי להפיק תועלת מ-enums, נסה למצוא היכן אתה יכול להשתמש ב-Enum בפרויקט שלך - זה יעניק לך ניסיון בעולם האמיתי, ועם הניסיון הזה תלמד יותר מאשר מדוגמאות, כי אתה תיתקל בעוד בעיות שאתה יכול להתמודד איתם יותר דרכים מורכבות ומפורטות.דרישות. כדאי לשים לב לשאלות האלה על Enum כדי לבחון את הידע שלכם, במיוחד אם אתם ממהרים לראיון ופשוט אין זמן לטבילה מפורטת ביקום Enum.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION