2013-01-03 23 views
9

Tôi đang duyệt qua một số đối tượng Java cơ sở khi tôi tìm thấy một đoạn mã được bao quanh bởi khối scan: {}. Đoạn mã sau là từ phương thức toLowerCase() bên trong lớp String.Khối tuyên bố được gắn nhãn trong Java?

scan: { 
      for (firstUpper = 0 ; firstUpper < len;) { 
       char c = value[firstUpper]; 
       if ((c >= Character.MIN_HIGH_SURROGATE) 
         && (c <= Character.MAX_HIGH_SURROGATE)) { 
        int supplChar = codePointAt(firstUpper); 
        if (supplChar != Character.toLowerCase(supplChar)) { 
         break scan; 
        } 
        firstUpper += Character.charCount(supplChar); 
       } else { 
        if (c != Character.toLowerCase(c)) { 
         break scan; 
        } 
        firstUpper++; 
       } 
      } 
      return this; 
     } 

Có thể ai đó vui lòng giải thích khối scan:{} được sử dụng và nơi cú pháp này xuất phát từ đâu? Tôi chưa thấy dấu hai chấm sau một từ như thế này trong Java trừ khi được sử dụng trong toán tử bậc ba.

Cảm ơn!

Chỉnh sửa: Cập nhật tiêu đề để khớp chính xác với câu hỏi được trả lời.

Trả lời

14

Ở đây, scan: chỉ đơn giản là một label. Cú pháp break <label> cho phép một cú phá vỡ vòng ngoài và mô phỏng một số dạng của câu lệnh goto. Cú pháp được diễn tả trong JLS:

Một tuyên bố break với nhãn Identifier nỗ lực để chuyển kiểm soát để báo cáo kết quả được dán nhãn kèm theo (§14.7) có cùng Identifier như nhãn của nó; tuyên bố này, được gọi là mục tiêu phá vỡ, sau đó ngay lập tức hoàn thành bình thường. Trong trường hợp này, mục tiêu ngắt không cần phải là câu hỏi switch, while, do hoặc for.

+0

Thực tế này có bị hủy bỏ như goto không? – Daniel

+2

@ Daniel: Tôi không muốn bắt đầu bất kỳ cuộc tranh luận tôn giáo nào. ;) Tuy nhiên, vì hình thức này có thể được coi là "có cấu trúc" hơn là một 'goto' thô, tôi sẽ tưởng tượng một số người ủng hộ 'goto' có thể coi nó ít phản đối. – NPE

+1

@ Không, bởi vì bạn không thể sử dụng nó để tự ý nhảy xung quanh trong mã. Nó hữu ích với 'break' trong vòng lặp lồng nhau để xác định vòng lặp nào cần thoát ra. – Alex

2

Đây là số labeled block. trong đó quét: là nhãn . Nó thường được sử dụng khi phá vỡ/tiếp tục trong trường hợp bạn có nhiều vòng lặp. Trong trường hợp này, break scan; chỉ cần thoát ra khỏi khối có nhãn (quét) khi được thực hiện.

2

Bạn có thể đặt nhãn để ngắt/hoặc tiếp tục từ trong vòng nhiều vòng sâu.

Ví dụ

outer: 
for(int i=...){ 
    for(int j=..){ 
    ... 
    break outer; // leaves both loops 

    } 

} 
+0

bạn nói đúng;) Chúc mừng 1k! – jlordo

1

Nó là một label. Nó là một chỉ báo cho kiểm soát dòng chảy.

Nếu bạn nhìn vào mã của bạn, bạn sẽ thấy bên dưới

break scan; 

Khi điều này xảy ra, dòng chảy thoát ra hoàn toàn khối scan.

Nhân tiện, nó có thể là bất kỳ số nhận dạng nào, scan không phải là một từ khóa nào cả.