CodeGym /จาวาบล็อก /สุ่ม /คำสั่งสวิตช์ Java
John Squirrels
ระดับ
San Francisco

คำสั่งสวิตช์ Java

เผยแพร่ในกลุ่ม

ทฤษฎีเล็กน้อยเกี่ยวกับ Java Switch

ลองนึกภาพว่าคุณเป็นอัศวินหยุดอยู่ที่ทางแยกของถนน ถ้าคุณไปทางซ้าย คุณจะเสียม้า ถ้าไปถูกทางก็จะได้ความรู้ เราจะแสดงสถานการณ์นี้ในรหัสได้อย่างไร คุณอาจทราบอยู่แล้วว่าเราใช้โครงสร้างเช่นif-thenและif-then-elseในการตัดสินใจเหล่านี้

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-then-else " ของคุณจะเติบโตในเวอร์ชันนี้ได้อย่างไร !

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 จะต้องเป็นอย่างใดอย่างหนึ่งต่อไปนี้:

    • ไบต์สั้นถ่าน int _ _ _ _
    • Byte , Short , Character , Integer (wrapper ของประเภทข้อมูลดั้งเดิม)
    • สตริง _
    • เอนั
  • บล็อกเริ่มต้นเป็นตัวเลือก หากไม่มีและ ExpressionForMakingAChoice ไม่ตรงกับ ValueX ใดๆ ก็จะไม่มีการดำเนินการใดๆ
  • คำ สั่ง พักไม่จำเป็น หากไม่มีอยู่ รหัสจะดำเนินการต่อไป (ละเว้นการเปรียบเทียบเพิ่มเติมในคำสั่ง case) จนกว่าจะเกิดbreak ครั้งแรก หรือจนกว่าจะสิ้นสุดคำสั่งswitch
  • หากจำเป็นต้องดำเนินการโค้ดเดียวกันสำหรับตัวเลือกหลายตัว เราสามารถกำจัดความซ้ำซ้อนได้ด้วยการระบุcase statement ที่ต่อเนื่องกันหลายตัว

มาดูวิธีใช้คำสั่ง switch ใน Java กัน

ไม่ต้องกังวล เราจบทฤษฎีแล้ว หลังจากที่คุณดูตัวอย่างต่อไปนี้แล้ว ทุกอย่างจะชัดเจนขึ้นมาก มาเริ่มกันเลยดีกว่า ลองดูตัวอย่างจากดาราศาสตร์เกี่ยวกับดาวเคราะห์ในระบบสุริยะของเรา ตามทัศนคติระหว่างประเทศล่าสุด เราได้ไม่รวมดาวพลูโต (เนื่องจากคุณสมบัติของวงโคจรของมัน) เราจำได้ว่าดาวเคราะห์ของเราจัดเรียงตามระยะห่างจากดวงอาทิตย์ดังนี้ ดาวพุธ ดาวศุกร์ โลก ดาวอังคาร ดาวพฤหัสบดี ดาวเสาร์ ดาวยูเรนัส และดาวเนปจูน ลองเขียนวิธีการ 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"].
ทดลองกับตัวแบ่ง: จะเกิดอะไรขึ้นหากเราลบคำสั่งตัวแบ่ง ทั้งหมด มาลองกัน:

    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;
}
ดูเหมือนว่ารหัสน้อยใช่มั้ย? เราได้ลดจำนวนใบแจ้งยอดทั้งหมดโดยเล่นกับลำดับของ ใบแจ้ง กรณีและจัดกลุ่มใหม่ ขณะนี้ก๊าซแต่ละประเภทถูกเพิ่มในรายการด้วยรหัสเพียงบรรทัดเดียว รหัสที่ระบุในตัวอย่างสุดท้ายเป็นเพียงการแสดงวิธีการทำงานของสิ่งต่างๆ เราไม่แนะนำให้เขียนโค้ดด้วยวิธีนี้ หากผู้เขียนโค้ด Java ดังกล่าว (นับประสากับโปรแกรมเมอร์คนอื่นๆ) ต้องดูแลรักษาโค้ดนี้ เขาหรือเธอจะพบว่ามันยากมากที่จะสร้างตรรกะที่อยู่เบื้องหลังการก่อตัวของบล็อกเคสเหล่านั้นและโค้ดที่ดำเนินการในคำสั่ง switch

ความแตกต่างจาก if

พิจารณาความคล้ายคลึงกันภายนอกของ คำสั่ง ifและswitchอย่าลืมว่า คำสั่ง switchจะเลือกกรณีใดกรณีหนึ่งตามค่าเฉพาะ ในขณะที่คำสั่ง if สามารถมีนิพจน์บูลีนใดๆ ก็ได้ โปรดระลึกไว้เสมอเมื่อออกแบบโค้ดของคุณ

บทสรุป

  • ใช้case statement มากกว่า 2 branch เพื่อไม่ให้ code ยุ่งเหยิงกับ if statement
  • อย่าลืมกรอกบล็อกตรรกะของสาขาสำหรับแต่ละค่าเฉพาะ (คำสั่งกรณี) โดยการแทรกคำสั่งแบ่ง
  • นิพจน์ ของคำสั่ง switchสามารถเป็นEnumหรือStringเช่นเดียวกับบางประเภทดั้งเดิม
  • จำบล็อกเริ่มต้น ใช้เพื่อจัดการกับค่าที่ไม่คาดคิด
  • เพื่อเพิ่มประสิทธิภาพการทำงาน ให้ย้ายโค้ดสาขาที่สอดคล้องกับค่าทั่วไปไปที่ส่วนเริ่มต้นของบล็อกสวิตช์
  • อย่าหลงไปกับ "การเพิ่มประสิทธิภาพ" ของคุณโดยการลบ คำสั่ง แบ่งที่ส่วนท้ายของ คำสั่ง กรณี - โค้ดดังกล่าวเข้าใจยาก และเป็นผลให้รักษาได้ยาก
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION