2013-07-23 38 views
12

Tôi gặp sự cố khi sử dụng câu lệnh chuyển đổi khi tôi cố xử lý một tình huống đặc biệt. Ví dụ, Tôi có 3 trường hợp: A, B, C.Tuyên bố chuyển đổi Java

  • cho A, tôi muốn làm statement_1 và statement_3.
  • cho B, tôi muốn thực hiện statement_2 và statement_3.
  • cho C, tôi muốn làm gì

nếu tôi sử dụng lệnh if-else, nó sẽ trông giống như sau:

if (not C){ 
    do statement_3 

    if B 
     do statement 2 
    else if A 
     do statement 1 

} 

Nếu tôi muốn sử dụng câu lệnh switch để làm tương tự tôi gặp rắc rối.

switch (variable){ 
case A: do statement_1 
case B: do statement_2 
// how to do statement 3 here? 
} 

Tôi đang cố gắng tránh các mã trùng lặp. Vì vậy, tôi nghĩ rằng làm thế nào để làm cho các mã đơn giản nhất có thể.

UPDATE 1:

  1. để làm cho mã của tôi/câu hỏi rõ ràng hơn, tôi chỉ muốn làm cho mã của tôi đơn giản/rõ ràng như tôi có thể, đó là lý do tại sao tôi muốn sử dụng câu lệnh switch thay vì nếu có. Ngoài ra, tôi nghe nói rằng tuyên bố chuyển đổi thường là nhanh hơn so với if-else. (Tôi không chắc chắn 100%).

  2. Tôi muốn sử dụng hộp chuyển đổi vì Trường hợp A, B, C là loại enum. họ không thay đổi. Xin lỗi về sự nhầm lẫn.

  3. mỗi câu lệnh có hơn 10 dòng mã. Đó là lý do tại sao tôi không muốn làm các việc sau:

    switch (enum variable) { 
    case A: 
        statement1 
        statement3 
    break; 
    case B: 
        statement2 
        statement3 
    break; 
    

    }

+0

Mã này sẽ không hoạt động, vì Java 6 trở lên dự kiến ​​giá trị của loại nguyên thủy. Java 7 có thể xử lý điều đó bằng Strings. – reporter

+2

chuyển đổi là không tốt - bạn không thể bỏ qua các trường hợp, đó là những gì bạn phải làm để tránh mã hóa cuộc gọi đến statement_3 hai lần – Bohemian

+9

có gì sai với 'if'? Nếu một công tắc không phải là công cụ thích hợp, đừng sử dụng nó. Hầu hết thời gian, nó không phải là công cụ phù hợp. –

Trả lời

25

tôi muốn giới thiệu để xác định chính xác những gì Các tuyên bố cần phải được thực hiện:

switch (variable){ 
    case A: 
     statement_1(); 
     statement_3(); 
     break; 
    case B: 
     statement_2(); 
     statement_3(); 
     break; 
} 

cho Update- 3:

tạo phương thức cho 10 dòng:

public void statement_1() { 
    //your 10 lines of code 
} 

nếu bạn luôn thực hiện câu lệnh_3, ngoại trừ trường hợp C, bạn có thể sử dụng if/else-blocks khi bạn viết chúng.

nhưng theo ý kiến ​​trung thực của tôi: xác định chính xác những gì phải được thực hiện trong trường hợp đó nếu bạn có một số lượng nhỏ các trường hợp. nó dễ dàng hơn để đọc cho người khác

+1

+1. Trong khi tôi là một người đề xuất rất lớn của DRY, một dòng mã bổ sung cho sự rõ ràng tuyệt đối là một chiến thắng. – user949300

3

Bạn có thể làm điều này:

switch (variable){ 
    case A: do statement_1; do statement_3; break; 
    case B: do statement_2; do statement_3; break;  
} 
1

Tại sao không tổ công tắc vào lệnh if? không có mã lặp lại theo cách này.

if(!C){ 
    statement_3; 
    switch(variable){ 
    case A: 
     statement_1; 
     break; 
    case B: 
     statement_2; 
     break; 
} 

hoặc sử dụng cả câu lệnh if và switch?

if(!C){ 
    statement_3; 
} 
switch(variable){ 
case A: 
    statement_1; 
    break; 
case B: 
    statement_2; 
    break; 
+0

nhưng tại sao lại sử dụng công tắc với 2 thùng và trộn tất cả lên? bạn không đạt được hiệu suất hay bất cứ điều gì. nó có thể gây nhầm lẫn cho các nhà phát triển khác –

+0

Vì câu hỏi được đề cập đến bằng cách sử dụng câu lệnh chuyển đổi. Nếu nó chỉ là 2 hoặc 3 trường hợp, thì nếu-elseif-else là con đường để đi. nhưng nếu có một nhóm các câu lệnh mà tất cả chia sẻ cùng một mã, nói một vài chục lần nhưng không theo một kịch bản, tại sao lặp lại mã khi bạn có thể thực thi nó trước khi chuyển đổi (miễn là một điều kiện nhất định không được đáp ứng) ? –

0

Tôi thường thấy giới thiệu enum s làm rõ thêm. Ở đây tôi tưởng tượng mỗi enum là một vấn đề có thể được giải quyết thông qua một số quá trình:

enum Issue { 
    A { 
    void handleIt() { 
     statement_1(); 
     statement_3(); 
    } 
    }, 
    B { 
    void handleIt() { 
     statement_2(); 
     statement_3(); 
    } 
    }, 
    C { 
    void handleIt() { 
     // Do nothing. 
    } 
    }, 
    D { 
    void handleIt() { 
     A.handleIt(); 
     B.handleIt(); 
    } 
    }; 

    abstract void handleIt(); 
} 

Lưu ý ở đây là bạn sẽ có được thêm lợi ích của việc có thể để xử lý một số vấn đề bằng cách sử dụng các giải pháp của các vấn đề khác (xem D của tôi enum).

0

Nếu một trường hợp có hơn 2-3 tuyên bố đó là Bette (từ quan điểm của khả năng đọc và mã sạch) để trích xuất chúng như phương pháp riêng biệt:

switch (variable){ 
    case A: handleCaseA(); break; 
    case B: handleCaseB(); break; 
    default: handleDefaultCase(); break; 
} 
0
switch (variable) { 
case A: 
do statement_1; 
do statement_3; 
break; 
case B: 
do statement_2; 
do statement_3; 
break; 
} 
+0

Quảng bá quá mức một sản phẩm/tài nguyên cụ thể có thể bị cộng đồng coi là spam. Hãy xem [trung tâm trợ giúp] (http://stackoverflow.com/help), đặc biệt [Loại hành vi nào được mong đợi của người dùng?] (Phần cuối cùng của http://stackoverflow.com/help/behavior) : Tránh tự quảng bá. Bạn cũng có thể quan tâm [Làm cách nào để quảng cáo trên Stack Overflow?] (Http://stackoverflow.com/help/advertising) – Draken

0

Một break có thể tiết kiệm một rất nhiều thời gian thực hiện vì nó "bỏ qua" việc thực hiện tất cả các phần còn lại của các mã trong switch chặn

public class SwitchExample { 
public static void main(String[] args) { 
    int number=10; 
    switch(number){ 
    case 10: System.out.println("10");break; 
    case 20: System.out.println("20");break; 
    case 30: System.out.println("30");break; 
    default:System.out.println("Not in 10, 20 or 30"); 
    } 
} 
} 

Output là 10

0

Ở đây bạn phải sử dụng if statement theo cách này vì trong switch thường có giá trị default.

if (letter == 'A' || letter == 'B') { System.out.println("Statement 3 ");} 
switch (letter) { 
      case 'A': 
       System.out.println("Statement 1 "); 
       break; 

      case 'B': 
       System.out.println("Statement 2 "); 
       break; 

      case 'C': 
       System.out.println(); 
       break; 
      default: 
       System.out.println("You entered wrong value"); 
     }