2010-11-05 34 views
9

Gần đây tôi đã thêm một mục trình đơn khác vào một ứng dụng java android và được ngạc nhiên rằng Eclipse đã nói biến đó từ trường hợp trước: break không phải là cục bộ (Vì vậy, tôi vừa thêm một hậu tố để nhận).Tại sao các biến không phải là cục bộ trong trường hợp báo cáo?

Tôi hơi bối rối như trong đầu, bộ trường hợp đầu tiên: ngắt sẽ không được thực thi nếu tùy chọn thứ 2 được chọn. Ai đó có thể giải thích suy nghĩ sai lầm của tôi được không?

 case R.id.menuDebugMode: 
      debugMode = !debugMode; 
      if (debugMode){ 
       Toast.makeText(mainActivity.this, "Debug Mode on - NOT TO BE USED WHILST DRIVING", Toast.LENGTH_LONG).show();   
      } else { 
       tvDebug.setText(""); 
       tvInfo.setText(""); 
      } 
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putBoolean("debugMode", debugMode); 
      editor.commit(); 
     break; 

     case R.id.menuSpeedMode: 
      speedSignMode = !speedSignMode; 
      if (speedSignMode){ 
       Toast.makeText(mainActivity.this, "SpeedSign Mode in use", Toast.LENGTH_LONG).show();   

      } else { 
        Toast.makeText(mainActivity.this, "MapSpeed Mode in use", Toast.LENGTH_LONG).show();    
      } 
      SharedPreferences settings2 = getSharedPreferences(PREFS_NAME, 0); 
      SharedPreferences.Editor editor2 = settings2.edit(); 
      editor2.putBoolean("speedSignMode", speedSignMode); 
      editor2.commit(); 
     break;` 
+0

Cảm ơn tất cả các câu trả lời nhanh và hữu ích - Tôi đánh dấu TME là một câu trả lời được chấp nhận (vì nó có câu trả lời rõ ràng về lý do tại sao :) nhưng tất cả các câu trả lời đều là những câu trả lời hay. Tôi thường là một lập trình viên loại if else elseif vì vậy đó là lý do tại sao tôi bị bắt ở đây :) – SimpleSi

Trả lời

9

Như trong C, trong Java một câu lệnh chuyển đổi không phải là điều mà người ta mong đợi khi nhìn vào nó. Sự bực bội làm cho khó hiểu rằng phạm vi không được tạo ra. Tất cả điều này sẽ được chuyển thành C, trong đó một công tắc chỉ là đường cú pháp. Trình biên dịch biến đổi một chuyển đổi thành một số bước nhảy có điều kiện. Điều này cho phép ngôn ngữ sử dụng thông qua, một tính năng trong khi thiết kế của C được dự định ("break" vẫn là tùy chọn). tính năng Java này vẫn tương thích với C.

switch(a): 
    case 1: 
     dosomething(); 
    case 2: 
     dosomemore(); 

được dịch sang

if(a==1) jump ##1; 
if(a==2) jump ##2; 
jump ##3; 
##1: 
dosometing(); 
##2: 
dosomemore(); 
##3: 
12

Bạn có quyền thực hiện nhiều nhất, nhưng trường hợp không tạo phạm vi mới. Bạn có thể tự tạo một khối với phạm vi riêng của nó.

case foo: 
    { 
     int var = ... 
    } 
    break; 

case bar: 
    { 
     int var = ... 
    } 
    break; 
+2

@Dave, điều đó hoàn toàn sai. Một tuyên bố phá vỡ dừng việc thực hiện rơi vào báo cáo trường hợp tiếp theo. – SimonC

3

Matthew là đúng - toàn bộ tuyên bố chuyển đổi có một phạm vi cho bất kỳ biến nào được khai báo trực tiếp trong đó. Bạn có thể thêm nhiều dấu ngoặc ôm theo câu trả lời của Matthew - nhưng nó gần như chắc chắn sẽ tốt hơn để bổ sung các phần thân của trường hợp ra làm phương thức. Có vẻ như họ đang làm khá nhiều để được bao gồm "nội tuyến" như thế.

Lưu ý rằng các quy tắc phạm vi ở đây không dành riêng cho Android - chúng là các quy tắc phạm vi của Java.

1

Bởi vì bạn không phải viết nhiều mã/logic ở đó - hãy chia nhỏ ra thành các phương thức.

4

Những người khác đã giải thích những gì bạn nên làm, và rằng đây là một ngôn ngữ điều Java, không phải là một điều cụ thể Android.

Khi đến lý do tại sao Ngôn ngữ Java được xác định theo cách này, tôi đã không tìm ra lý do hoàn toàn hợp lý. Điều tốt nhất tôi có thể nghĩ đến là nếu mỗi người trong danh sách trường hợp của một câu lệnh switch ngầm được xác định một phạm vi, sau đó những điều sau đây có thể dễ dàng được nhận định:

case foo: 
    int var = ... 
    // note drop through 
case bar: 
           int var = ... 
    var = var + 1; 
    break; 

Ít nhất với định nghĩa hiện tại của Phạm vi, tất cả các tập quán có khả năng gây nhầm lẫn dẫn đến lỗi biên dịch.

(IMO, sẽ tốt hơn nếu tránh bỏ qua trường hợp trong báo cáo chuyển đổi ... giống như C#. Nhưng lỗi thiết kế như thế dễ dàng hơn nhiều trong việc nhận biết và khó sửa khi đã thực hiện.)

1

trong additon cho câu trả lời khác: đây là lời giải thích từ java language definition:

Bất cứ khi nào dòng chảy của kiểm soát vào một khối [...], một biến mới được tạo ra cho mỗi biến địa phương khai báo trong một tuyên bố khai báo biến cục bộ ngay trong khối đó [...] Biến cục bộ Tively ngừng tồn tại khi thực hiện của khối [...] hoàn thành.

Phạm vi biến cục bộ là khối ({ ... }), bao gồm các khối bên trong. Khối thực sự trong mã của bạn là khối bắt đầu sau câu lệnh switch.

Các vấn đề liên quan