CodeGym /Blog Java /Ngẫu nhiên /Tuyên bố chuyển đổi Java

Tuyên bố chuyển đổi Java

Xuất bản trong nhóm

Một chút lý thuyết về Java Switch

Hãy tưởng tượng rằng bạn là một hiệp sĩ dừng lại ở một ngã ba đường. Nếu bạn đi bên trái, bạn sẽ bị mất ngựa. Nếu bạn đi đúng, bạn sẽ có được kiến ​​thức. Làm thế nào chúng ta sẽ đại diện cho tình huống này trong mã? Bạn có thể đã biết rằng chúng tôi sử dụng các cấu trúc như if-thenif-then-else để đưa ra những quyết định này.

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?");

Nhưng nếu con đường không chia thành hai mà thành mười thì sao? Bạn có những con đường "hoàn toàn bên phải", "hơi bên trái của con đường đó", "sang trái một chút", v.v., tổng cộng có 10 con đường có thể? Hãy tưởng tượng mã "if-then-else " của bạn sẽ phát triển như thế nào trong phiên bản này!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
Giả sử bạn có một ngã ba 10 ngã (điều quan trọng ở đây là số lượng tùy chọn là hữu hạn). Đối với những tình huống như vậy, Java có câu lệnh switch .

       switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }

Đây là cách tuyên bố hoạt động:
  • ExpressionForMakingAChoice được đánh giá. Sau đó, câu lệnh switch so sánh giá trị kết quả với ValueX tiếp theo (theo thứ tự chúng được liệt kê).
  • Nếu ExpressionForMakingAChoice khớp với ValueX, thì mã sau dấu hai chấm sẽ được thực thi.
  • Nếu gặp câu lệnh break thì quyền điều khiển sẽ được chuyển ra bên ngoài câu lệnh switch.
  • Nếu ExpressionForMakingAChoice không khớp với bất kỳ ValueX nào, thì quyền kiểm soát sẽ chuyển sang CodeForDefaultCase.
Điểm quan trọng
  • Trong câu lệnh chuyển đổi, loại ExpressionForMakingAChoice phải là một trong các loại sau:

    • byte , ngắn , char , int .
    • Byte , Short , Character , Integer (các hàm bao của các kiểu dữ liệu nguyên thủy).
    • Chuỗi .
    • liệt kê .
  • Khối mặc định là tùy chọn. Nếu nó không có và ExpressionForMakingAChoice không khớp với bất kỳ ValueX nào, thì sẽ không có hành động nào được thực thi.
  • Câu lệnh break là không bắt buộc. Nếu không có nó, mã sẽ tiếp tục được thực thi (bỏ qua các so sánh tiếp theo trong các câu lệnh tình huống) cho đến khi lần đầu tiên xảy ra ngắt hoặc cho đến khi kết thúc câu lệnh chuyển đổi .
  • Nếu cùng một đoạn mã cần được thực thi cho một số lựa chọn, chúng ta có thể loại bỏ trùng lặp bằng cách chỉ định một số câu lệnh tình huống liên tiếp .

Bây giờ chúng ta hãy xem cách sử dụng câu lệnh switch trong Java

Đừng lo lắng: chúng ta đã hoàn thành phần lý thuyết. Sau khi bạn xem các ví dụ sau, mọi thứ sẽ trở nên rõ ràng hơn nhiều. Vâng, chúng ta hãy bắt đầu. Hãy xem một ví dụ từ thiên văn học liên quan đến các hành tinh trong hệ mặt trời của chúng ta. Theo quan điểm quốc tế mới nhất, chúng tôi đã loại trừ Sao Diêm Vương (do đặc tính quỹ đạo của nó). Chúng tôi nhớ lại rằng các hành tinh của chúng ta được sắp xếp theo khoảng cách từ Mặt trời như sau: Sao Thủy, Sao Kim, Trái đất, Sao Hỏa, Sao Mộc, Sao Thổ, Sao Thiên Vương và Sao Hải Vương. Hãy viết một phương thức Java lấy số thứ tự của một hành tinh (so với khoảng cách của nó với Mặt trời) và trả về các thành phần chính của bầu khí quyển của hành tinh dưới dạng Danh sách<Chuỗi >. Bạn sẽ nhớ lại rằng một số hành tinh có thành phần khí quyển tương tự nhau. Như vậy, sao Kim và sao Hỏa chủ yếu chứa carbon dioxide; bầu khí quyển của Sao Mộc và Sao Thổ bao gồm hydro và heli; và Sao Thiên Vương và Sao Hải Vương thêm mêtan vào cặp khí cuối cùng. Đây là chức năng của chúng tôi:

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;
}
Lưu ý rằng chúng tôi đang sử dụng cùng một mã cho các hành tinh có thành phần khí quyển giống hệt nhau. Chúng tôi đã làm điều này bằng cách sử dụng các báo cáo trường hợp liên tiếp . Nếu chúng ta muốn có được thành phần bầu khí quyển của hành tinh quê hương của chúng ta, chúng ta gọi phương thức của mình với 3 làm đối số:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
Thử nghiệm với break: Điều gì xảy ra nếu chúng ta loại bỏ tất cả các câu lệnh break ? Thử một lần đi:

    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;
    }
Nếu chúng tôi in kết quả của System.out.println(getPlanetAtmosphere(3)) , thì chúng tôi thấy rằng hành tinh quê hương của chúng tôi không thể sống được. Hoặc là nó? Hãy tự đánh giá: ["Carbon dioxide", "Nitơ", "Oxy", "Hydrogen", "Helium", "Methane", "Hydrogen", "Helium"] . Tại sao điều này xảy ra? Chương trình thực hiện tất cả các câu lệnh tình huống sau lần khớp đầu tiên cho đến khi kết thúc khối chuyển đổi .

Tối ưu hóa quá mức các câu lệnh ngắt

Lưu ý rằng chúng ta có thể cải thiện phương pháp này bằng cách sắp xếp các câu lệnh ngắt và các trường hợp khác nhau.

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;
}
Có vẻ như ít mã hơn, phải không? Chúng tôi đã giảm tổng số câu lệnh bằng cách thay đổi thứ tự của các câu lệnh tình huống và nhóm chúng lại. Bây giờ mỗi loại khí được thêm vào danh sách chỉ trong một dòng mã. Mã được đưa ra trong ví dụ trước chỉ để hiển thị cách mọi thứ hoạt động. Chúng tôi không khuyến nghị viết mã theo cách này. Nếu tác giả của mã Java như vậy (chứ chưa nói đến các lập trình viên khác) phải duy trì nó, họ sẽ thấy rất khó để xây dựng lại logic đằng sau việc hình thành các khối trường hợp đó và mã được thực thi trong câu lệnh chuyển đổi .

Sự khác biệt từ nếu

Với những điểm giống nhau bên ngoài của câu lệnh ifswitch , đừng quên rằng câu lệnh switch chọn một trong các trường hợp dựa trên GIÁ TRỊ CỤ THỂ, trong khi câu lệnh if có thể có bất kỳ biểu thức boolean nào. Hãy ghi nhớ điều này khi thiết kế mã của bạn.

Phần kết luận

  • Sử dụng câu lệnh tình huống cho nhiều hơn hai nhánh để không làm lộn xộn mã của bạn với các câu lệnh if.
  • Đừng quên hoàn thành khối logic của nhánh cho từng giá trị cụ thể (câu lệnh trường hợp) bằng cách chèn câu lệnh ngắt .
  • Biểu thức của câu lệnh switch có thể là Enum hoặc String , cũng như một số kiểu nguyên thủy.
  • Ghi nhớ khối mặc định . Sử dụng nó để xử lý các giá trị không mong muốn.
  • Để tối ưu hóa hiệu suất, hãy di chuyển các nhánh mã tương ứng với các giá trị phổ biến nhất đến đầu khối chuyển đổi .
  • Đừng quá chú tâm vào việc "tối ưu hóa" bằng cách xóa các câu lệnh ngắt ở cuối các câu lệnh tình huống – mã như vậy rất khó hiểu và do đó, khó bảo trì.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION