CodeGym /בלוג Java /Random-HE /הצהרת מתג Java
John Squirrels
רָמָה
San Francisco

הצהרת מתג Java

פורסם בקבוצה

קצת תיאוריה על Java Switch

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

if (turn_left) { 
    System.out.println("You will lose your horse"); 
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else 
    System.out.println("So you're just going to stand there?");
אבל מה אם הדרך תתפצל לא לשניים, אלא לעשר? יש לך כבישים שהם "לגמרי ימינה", "קצת שמאלה מזה", "קצת יותר שמאלה" וכן הלאה, בסך הכל 10 כבישים אפשריים? תארו לעצמכם איך הקוד "אם-אז-אחר " שלכם יגדל בגרסה זו!

if (option1)
{}
else if (option2)
{}else if (optionN) ...
נניח שיש לך מזלג 10 כיווני בכביש (חשוב כאן שמספר האפשרויות סופי). עבור מצבים כאלה, ל-Java יש את הצהרת ה- switch .

       switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }
כך עובדת ההצהרה:
  • ExpressionForMakingAChoice מוערך. לאחר מכן, משפט ה-switch משווה את הערך המתקבל עם ה-ValueX הבא (בסדר שבו הם רשומים).
  • אם ExpressionForMakingAChoice תואם ל-ValueX, אז הקוד שאחרי הנקודתיים מבוצע.
  • אם נתקלת במשפט break , אזי השליטה מועברת מחוץ להצהרת ה-switch.
  • אם ExpressionForMakingAChoice לא תואם לאף ValueX, השליטה עוברת ל-CodeForDefaultCase.
נקודות חשובות
  • במשפט switch, סוג ExpressionForMakingAChoice חייב להיות אחד מהבאים:

    • byte , short , char , int .
    • Byte , Short , Character , Integer (עטיפות של סוגי הנתונים הפרימיטיביים).
    • מחרוזת .
    • Enum .
  • בלוק ברירת המחדל הוא אופציונלי. אם הוא נעדר ו-ExpressionForMakingAChoice לא תואם לאף ValueX, אז לא תבוצע שום פעולה.
  • הצהרת הפסקה אינה נדרשת. אם הוא נעדר, הקוד ימשיך להתבצע (בהתעלמות מהשוואות נוספות בהצהרות המקרה) עד להתרחשות הראשונה של הפסקה או עד סוף משפט ה-switch .
  • אם צריך להפעיל את אותו קוד עבור מספר אפשרויות, נוכל לבטל כפילות על ידי ציון מספר הצהרות מקרה עוקבות .

כעת נסקור כיצד נעשה שימוש במשפט ה-switch ב-Java

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

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
שימו לב שאנו משתמשים באותו קוד עבור כוכבי לכת עם הרכבים אטמוספריים זהים. עשינו זאת על ידי שימוש בהצהרות מקרה עוקבות . אם אנחנו רוצים לקבל את הרכב האטמוספירה של כוכב הלכת הביתי שלנו, אנחנו קוראים לשיטה שלנו עם 3 כטיעון:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
ניסוי עם break: מה קורה אם נסיר את כל הצהרות הפסקה ? בואו ננסה את זה:

    public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
        List<String> result = new ArrayList<>();
        switch (seqNumberFromSun) {
            case 1: result.add("No atmosphere");
            case 2:
            case 4: result.add("Carbon dioxide");
            case 3: result.add("Carbon dioxide");
                result.add("Nitrogen");
                result.add ("Oxygen");
            case 5:
            case 6: result.add("Hydrogen");
                result.add("Helium");
            case 7:
            case 8: result.add("Methane");
                result.add("Hydrogen");
                result.add("Helium");
            default:
        }
        return result;
    }
אם נדפיס את התוצאה של System.out.println(getPlanetAtmosphere(3)) , אז נגלה שכוכב הבית שלנו לא כל כך ראוי לחיות. או שזה? תשפטו בעצמכם: ["פחמן דו חמצני", "חנקן", "חמצן", "מימן", "הליום", "מתאן", "מימן", "הליום"] . למה זה קרה? התוכנית מבצעת את כל הצהרות המקרה לאחר ההתאמה הראשונה עד סוף בלוק המתג .

אופטימיזציה מוגזמת של הצהרות הפסקה

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

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
נראה כמו פחות קוד, נכון? צמצמנו את המספר הכולל של ההצהרות על ידי משחק עם סדר הצהרות המקרה וקיבוץ מחדש. כעת כל סוג גז מתווסף לרשימה בשורת קוד אחת בלבד. הקוד שניתן בדוגמה האחרונה הוא רק כדי להראות איך דברים עובדים. אנחנו לא ממליצים לכתוב קוד בצורה זו. אם המחבר של קוד ג'אווה כזה (שלא לדבר על מתכנתים אחרים) חייב לתחזק אותו, הוא או היא יתקשה מאוד לשחזר את ההיגיון מאחורי היווצרותם של אותם בלוקים של המקרים והקוד המבוצע במשפט switch .

הבדלים מאם

בהתחשב בדמיון החיצוני של הצהרות if ו- switch , אל תשכח שהמשפט switch בוחר באחד מהמקרים על סמך ערך SPECIFIC, בעוד שהמשפט if יכול להיות בעל כל ביטוי בוליאני. זכור זאת בעת עיצוב הקוד שלך.

סיכום

  • השתמש בהצהרת המקרה ליותר משני ענפים כדי לא להעמיס את הקוד שלך בהצהרות if.
  • אל תשכח להשלים את הבלוק הלוגי של הענף עבור כל ערך ספציפי (משפט מקרה) על ידי הכנסת הצהרת break .
  • הביטוי של משפט ה- switch יכול להיות Enum או String , כמו גם כמה סוגים פרימיטיביים.
  • זכור את בלוק ברירת המחדל . השתמש בו כדי לטפל בערכים בלתי צפויים.
  • כדי לייעל את הביצועים, העבר את ענפי הקוד התואמים לערכים הנפוצים ביותר לתחילת בלוק המתגים .
  • אל תיסחף ב"אופטימיזציה" שלך על ידי מחיקת הצהרות הפסקה בסוף הצהרות המקרה – קוד כזה קשה להבנה, וכתוצאה מכך קשה לתחזוקה.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION