הצמדת ערכים ל- Java Enum

1. הקדמה

הג'אווה enum סוג מספק דרך נתמכת בשפה ליצור ולהשתמש בערכים קבועים. על ידי הגדרת מערך סופי של ערכים, ה- enum בטוח יותר לסוג מאשר משתנים מילוליים קבועים כמו חוּט אוֹ int.

למרות זאת, enum ערכים נדרשים להיות מזהים תקפים, ואנחנו מוזמנים להשתמש ב- SCREAMING_SNAKE_CASE על פי מוסכמה.

בהתחשב במגבלות האלה, ה enum ערך לבדו אינו מתאים למחרוזות קריאות אדם או לערכים שאינם מחרוזות.

במדריך זה נשתמש ב- enum'תכונות ככיתת Java לצירוף הערכים שאנו רוצים.

2. שימוש בג'אווה Enum כמחלקה

לעתים קרובות אנו יוצרים enum כרשימת ערכים פשוטה. לדוגמה, להלן שתי השורות הראשונות בטבלה המחזורית כפשוטן enum:

אלומיניום אלומיניום {H, HE, LI, BE, B, C, N, O, F, NE}

באמצעות התחביר שלמעלה, יצרנו עשרה מקרים סטטיים וסופיים של ה- enum נקרא אֵלֵמֶנט. אמנם זה יעיל מאוד, אך תפסנו רק את סמלי האלמנטים. ולמרות שצורת המקרה הראשי מתאימה לקבועי ג'אווה, בדרך כלל איננו כותבים את הסמלים.

יתר על כן, חסרים לנו גם מאפיינים אחרים של יסודות הטבלה המחזורית, כמו השם והמשקל האטומי.

למרות ש enum לסוג יש התנהגות מיוחדת בג'אווה, אנו יכולים להוסיף קונסטרוקטורים, שדות ושיטות כפי שאנו עושים עם מחלקות אחרות. בגלל זה, אנו יכולים לשפר את שלנו enum לכלול את הערכים שאנחנו צריכים.

3. הוספת קונסטרוקטור ושדה סופי

נתחיל בהוספת שמות האלמנטים. נגדיר את השמות ל- a סופי משתנה באמצעות קונסטרוקטור:

אלומיניום ציבורי אלמנט {H ("מימן"), HE ("הליום"), // ... NE ("ניאון"); תווית מחרוזת סופית ציבורית; אלמנט פרטי (תווית מחרוזת) {this.label = label; }}

קודם כל, אנו מבחינים בתחביר המיוחד ברשימת ההצהרה. כך מופעל קונסטרוקטור enum סוגים. למרות שזה לא חוקי להשתמש ב- חָדָשׁ מפעיל עבור enum, נוכל להעביר טיעוני קונסטרוקטור ברשימת ההצהרה.

לאחר מכן אנו מכריזים על משתנה מופע תווית. יש כמה דברים לציין לגבי זה.

ראשית, בחרנו ב- תווית מזהה במקום שֵׁם. אמנם תחום החברים שֵׁם זמין לשימוש, בואו נבחר תווית כדי למנוע בלבול עם המוגדר מראש Enum.name () שיטה.

שנית, שֶׁלָנוּ תווית שדה הוא סופי. בעוד שדות של enum לא צריך להיות סופי, ברוב המקרים אנחנו לא רוצים שהתוויות שלנו ישתנו. ברוח ה enum כאשר הערכים הם קבועים, זה הגיוני.

סוף - סוף, ה תווית שדה הוא ציבורי. לפיכך, אנו יכולים לגשת ישירות לתווית:

System.out.println (BE.label);

מצד שני, השדה יכול להיות פְּרָטִי, גישה אליו עם getLabel () שיטה. לצורך קיצור, מאמר זה ימשיך להשתמש בסגנון השדה הציבורי.

4. איתור Java Enum ערכים

Java מספקת valueOf (מחרוזת) שיטה לכולם enum סוגים. לפיכך, אנחנו תמיד יכולים לקבל enum ערך המבוסס על השם המוצהר:

assertSame (Element.LI, Element.valueOf ("LI"));

עם זאת, ייתכן שנרצה לחפש enum ערך גם לפי שדה התווית שלנו. לשם כך נוכל להוסיף א סטָטִי שיטה:

ערך סטטי ציבורי של Element ElementOfLabel (תווית מחרוזת) {עבור (Element e: values ​​()) {if (e.label.equals (label)) {return e; }} להחזיר null; }

הסטטי valueOfLabel () השיטה מאחרת את אֵלֵמֶנט ערכים עד שהוא ימצא התאמה. זה חוזר ריק אם לא נמצא התאמה. לעומת זאת, ניתן להשליך חריג במקום לחזור ריק.

בואו נראה דוגמה מהירה באמצעות שלנו valueOfLabel () שיטה:

assertSame (Element.LI, Element.valueOfLabel ("ליתיום"));

5. שמירת ערכי הבדיקה

אנחנו יכולים להימנע מאיטרציה של enum ערכים באמצעות a מַפָּה כדי לשמור את התוויות במטמון. לשם כך אנו מגדירים א מפה סופית סטטית ואכלס אותו כאשר הכיתה נטענת:

אלמנט enum ציבורי {// ... enum מעריך פרטית סופית מפה BY_LABEL = HashMap חדש (); סטטי {עבור (אלמנט e: ערכים ()) {BY_LABEL.put (e.label, e); }} // ... שדות, קונסטרוקטור, שיטות ציבוריות סטטיות ציבוריות valueOfLabel (תווית מחרוזת) {return BY_LABEL.get (label); }}

כתוצאה ממחסור המטמון, enum ערכים מתבטלים פעם אחת בלבד, וה valueOfLabel () השיטה פשוטה.

כחלופה, אנו יכולים לבנות בעצלתיים את המטמון כאשר הוא נגיש לראשונה ב- valueOfLabel () שיטה. במקרה כזה, יש לסנכרן גישה למפות כדי למנוע בעיות במקביל.

6. צירוף ערכים מרובים

ה Enum בנאי יכול לקבל ערכים מרובים. לשם המחשה, בואו נוסיף את המספר האטומי כ- int והמשקל האטומי כ- לָצוּף:

אלומיניום אלומיניום {H ("מימן", 1, 1.008f), HE ("הליום", 2, 4.0026f), // ... NE ("ניאון", 10, 20.180f); סופי סטטי פרטי מפה BY_LABEL = חדש HashMap (); גמר סטטי פרטי פרטי BY_ATOMIC_NUMBER = HashMap חדש (); סופי סטטי פרטי מפה BY_ATOMIC_WEIGHT = HashMap חדש (); סטטי {עבור (אלמנט e: ערכים ()) {BY_LABEL.put (e.label, e); BY_ATOMIC_NUMBER.put (e.atomicNumber, e); BY_ATOMIC_WEIGHT.put (e.atomicWeight, e); }} תווית מחרוזת סופית ציבורית; גמר ציבורי אינטומי אטומי מספר; צף ציבורי אטומי משקל ציבורי; אלמנט פרטי (תווית מחרוזת, int atomicNumber, float atomicWeight) {this.label = label; this.atomicNumber = atomicNumber; this.atomicWeight = אטומי משקל; } ערך סטטי ציבורי של ערך ElementOfLabel (תווית מחרוזת) {return BY_LABEL.get (label); } ערך אלמנט סטטי ציבוריOfAtomicNumber (מספר int) {return BY_ATOMIC_NUMBER.get (number); } ערך אלמנט סטטי ציבוריOfAtomicWeight (משקל צף) {return BY_ATOMIC_WEIGHT.get (weight); }}

באופן דומה, אנו יכולים להוסיף לערכים שנרצה ל enum, כגון סמלי המקרים הנכונים, "הוא", "לי" ו"יהי ", למשל.

יתר על כן, אנו יכולים להוסיף לערכים מחושבים שלנו enum על ידי הוספת שיטות לביצוע פעולות.

7. שליטה בממשק

כתוצאה מהוספת שדות ושיטות שלנו enum, שינינו את הממשק הציבורי שלו. לכן, הקוד שלנו, המשתמש בליבה Enumשֵׁם() ו ערך של() שיטות, לא יהיו מודעים לשדות החדשים שלנו.

ה סטָטִיערך של() השיטה כבר מוגדרת עבורנו על ידי שפת Java. לכן, איננו יכולים לספק את עצמנו ערך של() יישום.

בדומה לכך, בגלל ה Enum.name () השיטה היא סופי, גם אנחנו לא יכולים לעקוף את זה.

כתוצאה מכך, אין שום דרך מעשית להשתמש בשדות הנוספים שלנו באמצעות התקן Enum ממשק API. במקום זאת, בואו נסתכל על דרכים שונות לחשיפת השדות שלנו.

7.1. שׁוֹלֵט toString ()

שׁוֹלֵט toString () עשוי להיות חלופה לביטול שֵׁם():

@ עקוב ציבורי מחרוזת toString () {להחזיר this.label; }

כברירת מחדל, Enum.toString () מחזירה את אותו ערך כמו Enum.name ().

7.2. יישום ממשק

ה enum הקלד ב- Java יכול ליישם ממשקים. אמנם גישה זו אינה כללית כמו ה- Enum ממשק API, ממשקים כן עוזרים לנו להכליל.

בואו ניקח בחשבון את הממשק הזה:

ממשק ציבורי שכותרתו {String label (); }

לעקביות עם Enum.name () השיטה, שלנו תווית() לשיטה אין לקבל קידומת.

ומכיוון שה- valueOfLabel () השיטה היא סטָטִי, אנחנו לא כוללים את זה בממשק שלנו.

לבסוף, אנו יכולים ליישם את הממשק שלנו enum:

אלומיניום אלומיני מיישם תוויות עם התווית {// ... @ תווית מחרוזת ציבורית ציבורית () {תווית החזרה; } // ...}

יתרון אחד בגישה זו הוא בכך ש תויג ניתן להחיל ממשק על כל מחלקה, לא רק enum סוגים. במקום להסתמך על הגנרי Enum API, עכשיו יש לנו API ספציפי יותר להקשר.

8. מסקנה

במאמר זה, בחנו תכונות רבות של Java Enum יישום. על ידי הוספת בונים, שדות ושיטות אנו רואים שה- enum יכול לעשות הרבה יותר מקבועים מילוליים.

כמו תמיד, ניתן למצוא את קוד המקור המלא של מאמר זה ב- GitHub.