2015-08-06 92 views
5

Tôi chỉ nhận thấy rằng việc khai báo biến lặp không thể được thực hiện bên ngoài cho mỗi trường hợp cho vòng lặp truyền thống.Cách sử dụng cho mỗi lần lặp lại và khai báo biến lặp bên ngoài

Say cho ví dụ, sau đây dưới đây là không thể:

String str; 
for(str : strings) { 
    // Do something 
} 

Nhưng với truyền thống vòng lặp for, tôi có thể khai báo các biến điều khiển vòng lặp bên ngoài quá, để tôi có thể tái sử dụng nó hoặc để nhận được cuối cùng giá trị bên ngoài vòng lặp.

int i; 
for(; i < strings.length; i++) { 
    // Do something 
} 
System.out.println("I iterated upto " + i); 

Tại sao hạn chế này được giữ cho cấu trúc vòng lặp cho mỗi lần? Tôi đồng ý rằng biến lặp có thể nhận giá trị chỉ từ trong vòng lặp for-each. Nhưng tại sao không sử dụng nó bên ngoài để giữ và sử dụng nó cho một giá trị mặc định hoặc giá trị phần tử cuối cùng từ vòng lặp? Tuy nhiên, hạn chế này trông rất ngây thơ và cảm thấy như một cái gì đó của tự do của tôi trước khi được đưa ra. Nếu một điều như vậy là có thể, tôi đã viết một đoạn mã như sau:

String[] strings = new String[]{"First", "Middle", "Last"}; 
String str = "Default"; 
for(str : strings) { 
    // Do something. 
} 
if(str.equals("Last") { 
System.out.println("I did a for each iteration and my last value is " + str); 
} else { 
System.out.println("I couldn't iterate, so what I can show you is " + str); 
} 

Vì vậy, nếu mảng chuỗi trống, tôi sẽ thấy một thông điệp duyên dáng là "Tôi không thể lặp lại, vì vậy những gì tôi có thể hiển thị cho bạn là Mặc định ". Nếu mảng chuỗi của tôi có các phần tử như trên, tôi có thể thấy thông báo là "Tôi đã làm cho mỗi lần lặp và giá trị cuối cùng của tôi là Cuối cùng" mà không có biến boolean bổ sung để kiểm tra xem tôi có đi trong vòng lặp hay không.

Cũng làm gì để thực thi này khai báo biến lặp, tôi đang phải đối mặt với một vấn đề khác với các cuộc xung đột không gian tên quá:

String string = "Hello"; 
----------------------- 
----------------------- 
for(String string : strings) { // I am forced to use a different name for string, though I prefer to use as a string only for my conventional semantics. 
    // Do something 
} 

Một số người ta có thể cảm nhận được đó là một sở thích cá nhân. Tuy nhiên, cấu trúc ngôn ngữ có thể đủ linh hoạt bất cứ khi nào có thể. Tôi không thấy bất kỳ lý do hợp lệ nào để giữ giới hạn phạm vi này đặc biệt cho mỗi người. Nó có ý nghĩa không? Hãy để tôi biết suy nghĩ của bạn.

+0

Nó được coi là một thực hành tốt để khai báo các biến với phạm vi giới hạn nhất có thể; IMO, tái sử dụng biến bên ngoài vòng lặp for làm cho mã khó đọc hơn (và dễ bị lỗi hơn). –

+0

Tôi đồng ý, nhưng tất cả những gì tôi nói là, một ngôn ngữ không được hạn chế tôi về những thứ như vậy. –

Trả lời

0

Thật không may, bạn sẽ phải sử dụng một biến tạm thời, như vậy:

String tmp = "default"; 
for(String str : strings) { 
    tmp = str; 
    // Do something 
} 
//tmp here is the last used value in the loop 
//And other stuff 

Lưu ý: Tên của biến tạm thời bạn chọn phải khác với biến vòng lặp.

Đối với lựa chọn thiết kế của vòng lặp, tôi nghĩ chúng ta phải tô nó lên một sự giám sát cú pháp (trớ trêu thay trên một biểu tượng được sử dụng như cú pháp) mà bạn không thể khai báo trước giá trị.

Theo câu hỏi thứ hai của bạn, bạn sẽ phân biệt như thế nào giữa số string mà bạn đang cố gắng tham chiếu?

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