2014-02-13 43 views
1

看起來好像你可以完全在循環內聲明掃描儀,它會工作得很好。
我讀過你應該給你變量儘可能小的範圍。這是否意味着我寫的下面的代碼不正確?使用新運算符還是在循環中聲明變量?

Scanner SeatScan; 
int x = 0,y = 0; 
for(int i = 0; i < names.size(); i++) { 
    SeatScan = new Scanner(seats.get(i)); 
    if(SeatScan.hasNext()){ 
     x = SeatScan.nextInt(); 
     y = SeatScan.nextInt(); 
    } 
    people.add(new Person(x,y,names.get(i))); 
} 

這是更好的

for(int i = 0; i < names.size(); i++) { 
    int x = 0,y = 0; 
    Scanner SeatScan = new Scanner(seats.get(i)); 
    if(SeatScan.hasNext()){ 
     x = SeatScan.nextInt(); 
     y = SeatScan.nextInt(); 
    } 
    people.add(new Person(x,y,names.get(i))); 
} 

不會循環申報並重新分配x和y的值設置爲0每次迭代之後並在重新申報的掃描一遍又一遍(雖然它可能沒有按不這樣做)?同樣對於第一個代碼,我不會從eclipse得到關於我的掃描儀的警告。 如果我關閉它說「掃描儀未初始化」?對於第二個版本,它說資源泄漏,掃描儀永遠不會關閉。這裏發生了什麼,以及如何在使用循環時從現在開始聲明我的變量?

+1

'應該'vs'必須'。 –

+0

這取決於..是否要在循環外使用x和y ......否則沒有區別.. – TheLostMind

+0

旁註:您應該以小寫字母開頭所有變量名 - 這是Java中的約定(除非變量是最終的)。 – ujvl

回答

3

Scanner seatScan參考不是一個對象。 JVM足夠聰明,可以在方法開始時分配所有局部變量,因此嵌套變量不會影響性能。即它不會在運行時創建和銷燬某些內容。

如果你看看這個方法的字節碼(你有調試信息),你會看到在整個方法的所有局部變量的末尾都有一個表。

順便說一句:如果有有效的輸入,你可能會創建一個Person。

總之,除非你知道你有性能問題,因爲你測量了它,你應該假設最清晰,最簡單的代碼也將運行得足夠快。

如果我要改變任何東西,我會使用Java編碼約定並使用以小寫字母開頭的變量,例如, seatScan不是SeatScan它看起來像一個類名。

0

這一切都取決於你的需要,在程序中你想使用變量的地方。根據你的代碼片段第二種方法接縫更合適。

只需在if塊後關閉掃描器,併爲x和y添加有效值檢查。

for(int i = 0; i < names.size(); i++) { 
    int x = 0,y = 0; 
    Scanner seatScan = new Scanner(seats.get(i)); 
    if(seatScan.hasNext()){ 
    x = seatScan.nextInt(); 
    y = seatScan.nextInt(); 
    } 

    seatScan.close(); 
    if(x!=0 && y!=0) { 
     people.add(new Person(x,y,names.get(i))); 
    } 
}