הצהרת מתג Java

1. סקירה כללית

במדריך זה נלמד מה החלף הצהרה היא ואיך להשתמש בה.

ה החלף הצהרה מאפשרת לנו להחליף כמה מקוננים אחרת בונה ובכך לשפר את הקריאות של הקוד שלנו.

החלף התפתח עם הזמן - נוספו סוגים נתמכים חדשים, במיוחד ב- Java 5 ו- 7. כמו כן, הוא ממשיך להתפתח - החלף ככל הנראה יוצגו ביטויים ב- Java 12.

להלן ניתן דוגמאות קוד להדגמת השימוש ב- החלף הצהרה, תפקידו של לשבור הצהרה, הדרישות ל החלף טַעֲנָה/מקרה ערכים והשוואה בין חוּטחטא מתג הַצהָרָה.

נעבור לדוגמא.

2. דוגמה לשימוש

נניח, יש לנו את הדברים הבאים מקוננים אחרת הצהרות:

public String exampleOfIF (String animal) {מחרוזת תוצאה; אם (animal.equals ("DOG") || animal.equals ("CAT")) {result = "animal animal"; } אחר אם (animal.equals ("TIGER")) {result = "חיית בר"; } אחר {result = "בעל חיים לא ידוע"; } להחזיר תוצאה; }

הקוד שלעיל לא נראה טוב ויהיה קשה לתחזק אותו ולנמק אותו. כדי לשפר את הקריאות נוכל להשתמש ב- החלף הצהרה כאן:

public String exampleOfSwitch (חית מחרוזת) {מחרוזת תוצאה; מתג (חיה) {case "DOG": result = "animal animal"; לשבור; מקרה "CAT": result = "animal animal"; לשבור; מקרה "TIGER": result = "חיית בר"; לשבור; ברירת מחדל: תוצאה = "בעל חיים לא ידוע"; לשבור; } להחזיר תוצאה; }

כפי שמוצג לעיל, אנו משווים את ה- החלף טַעֲנָה בעל חיים עם כמה מקרה ערכים. אם אף אחד מה מקרה הערכים שווים לוויכוח, ואז הבלוק מתחת ל בְּרִירַת מֶחדָל התווית מבוצעת.

במילים פשוטות, ה לשבור הצהרה משמשת ליציאה א החלף הַצהָרָה.

3. ה לשבור הַצהָרָה

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

אם נשכח לכתוב א לשבור, הבלוקים שמתחת יבוצעו.

כדי להדגים זאת בואו נשמיט את לשבור הצהרות והוסף את הפלט למסוף עבור כל בלוק:

מחרוזת ציבורית forgetBreakInSwitch (חית מחרוזת) {switch (חיה) {מקרה "DOG": System.out.println ("חיית בית"); ברירת מחדל: System.out.println ("בעל חיים לא ידוע"); }}

בוא נבצע קוד זה שכחBreakInSwitch("כֶּלֶב"), ובדוק את הפלט כדי להוכיח שכל הבלוקים מבוצעים:

חיית בית בעל חיים לא ידוע

אז אנחנו צריכים להיות זהירים ולהוסיף לשבור הצהרות בסוף כל בלוק אלא אם כן יש צורך לעבור לקוד תחת התווית הבאה.

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

אנחנו יכולים גם לנצל את ההתנהגות הזו ל לְהַשְׁמִיט לשבור כאשר אנו רוצים שאותו קוד יבוצע למספר הצהרות מקרה. בואו נכתוב מחדש את הדוגמה בחלק הקודם על ידי קיבוץ שני המקרים הראשונים:

public String exampleOfSwitch (מחרוזת חיה) {מחרוזת תוצאה; מתג (חיה) {case "DOG": case "CAT": result = "animal animal"; לשבור; מקרה "TIGER": result = "חיית בר"; לשבור; ברירת מחדל: תוצאה = "בעל חיים לא ידוע"; לשבור; } להחזיר תוצאה; }

4. החלף ויכוח ו מקרה ערכים

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

4.1. סוגי מידע

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

  • בתים ו בייט
  • קצר ו קצר
  • int ו מספר שלם
  • לְהַשְׁחִיר ו אופי
  • enum
  • חוּט

חוּט סוג זמין ב החלף הצהרה המתחילה ב- Java 7.

enum סוג הוצג ב- Java 5 והיה זמין ב החלף הצהרה מאז.

שיעורי עטיפה זמינים גם מאז Java 5.

כמובן, החלף ויכוח ו מקרה הערכים צריכים להיות מאותו סוג.

4.2. לא ריק ערכים

אנחנו לא יכולים לעבור את ריק ערך כוויכוח ל- a החלף הַצהָרָה. אם נעשה זאת, התוכנית תזרוק NullPointerException, באמצעות הראשון שלנו החלף דוגמא:

@Test (צפוי = NullPointerException.class) בטל בציבור כאשר SwitchAgumentIsNull_thenNullPointerException () {חיה מחרוזת = null; Assert.assertEquals ("חיית בית", s.exampleOfSwitch (חיה)); }

כמובן, אנחנו לא יכולים גם לעבור ריק כערך ל מקרה תווית של החלף הַצהָרָה. אם נעשה זאת, הקוד לא יתכנס.

4.3. מקרה ערכים כקבועי זמן קומפילציה

אם ננסה להחליף את כֶּלֶב ערך מקרה עם המשתנה כֶּלֶב הקוד לא יצטבר עד שנסמן את כֶּלֶב משתנה כ סופי:

כלב מחרוזת סופי = "כלב"; חתול מיתרים = "CAT"; מתג (חיה) {case dog: // compiles result = "animal animal"; case cat: // לא מרכיב תוצאה = "חתולית"}

4.4. חוּט השוואה

אם החלף הצהרה השתמשה במפעיל השוויון כדי להשוות מחרוזות שלא הצלחנו להשוות בין חוּט טענה שנוצרה עם חָדָשׁ מפעיל לא חוּט ערך המקרה כהלכה.

למרבה המזל, ה החלף המפעיל משתמש ב- שווים() שיטה מתחת למכסה המנוע.

בואו נדגים זאת:

@ מבחן ציבורי בטל כאשרCompareStrings_thenByEqual () {בעלי חיים מחרוזת = מחרוזת חדשה ("כלב"); assertEquals ("חיית בית", s.exampleOfSwitch (חיה)); }

5. החלף ביטויים

JDK 13 זמין כעת ומביא גרסה משופרת של תכונה חדשה שהוצגה לראשונה ב- JDK 12: החלף ביטוי.

על מנת לאפשר זאת, עלינו לעבור –אפשר תצוגה מקדימה למהדר.

5.1. החדש החלף ביטוי

בואו נראה מה החדש החלף הביטוי נראה כמו במעבר של חודשים:

var result = switch (חודש) {case JANUARY, JUNE, JULY -> 3; מקרה פברואר, ספטמבר, אוקטובר, נובמבר, דצמבר -> 1; מקרה מרץ, מאי, אפריל, אוגוסט -> 2; ברירת מחדל -> 0; }; 

שליחה בערך כמו חודש. יוני היה קובע תוֹצָאָה ל 3.

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

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

5.2. ה תְשׁוּאָה מילת מפתח

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

var result = switch (חודש) {case JANUARY, JUNE, JULY -> 3; מקרה פברואר, ספטמבר, אוקטובר, נובמבר, דצמבר -> 1; מקרה מרץ, מאי, אפריל, אוגוסט -> {int monthLength = month.toString (). אורך (); חודש תשואה אורך * 4; } ברירת מחדל -> 0; };

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

5.3. חוזרים פנימה החלף ביטויים

כתוצאה מההבחנה בין החלף הצהרות ו החלף ביטויים, זה אפשרי ש לַחֲזוֹר מבפנים א החלף הצהרה, אך אסור לנו לעשות זאת מתוך a החלף ביטוי.

הדוגמה הבאה תקפה לחלוטין ותקבץ:

החלף (חודש) {מקרה ינואר, יוני, יולי -> {חזרה 3; } ברירת מחדל -> {חזרה 0; }}

עם זאת, הקוד הבא לא יתכנס, כפי שאנו מנסים לַחֲזוֹר מחוץ לביטוי מתג סוגר:

var result = switch (חודש) {case JANUARY, JUNE, JULY -> {return 3; } ברירת מחדל -> {חזרה 0; }};

5.4. מיצוי

כשמשתמש החלף הצהרות, זה לא ממש משנה אם כל המקרים מכוסים.

הקוד הבא, למשל, תקף לחלוטין ויקבץ:

מתג (חודש) {מקרה ינואר, יוני, יולי -> 3; מקרה פברואר, SEPTEMBER -> 1; }

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

var result = switch (חודש) {case JANUARY, JUNE, JULY -> 3; מקרה פברואר, SEPTEMBER -> 1; }

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

var result = switch (חודש) {case JANUARY, JUNE, JULY -> 3; מקרה פברואר, ספטמבר, אוקטובר, נובמבר, דצמבר -> 1; מקרה מרץ, מאי, אפריל, אוגוסט -> 2; }

לידיעתך, בקטע הקוד שלמעלה אין בְּרִירַת מֶחדָל מקרה. כל עוד כל המקרים מכוסים, החלף הביטוי יהיה תקף.

6. מסקנה

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

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

כמו תמיד קוד JDK 8 השלם וקוד JDK 13 זמינים ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found