2016-08-04 72 views
6

在Java中,可以在for -loop的初始化部分來聲明一個變量:是否有可能在Java中聲明一個變量而有條件?

for (int i=0; i < 10; i++) { 
    // do something (with i) 
} 

但隨着while聲明這似乎並不可能。

很多時候我看到這樣的代碼,當條件while循環需要在每次迭代後進行更新:

List<Object> processables = retrieveProcessableItems(..); // initial fetch 
while (processables.size() > 0) { 
    // process items 
    processables = retrieveProcessableItems(..); // update 
} 

這裏的計算器,我發現至少a solution防止取的的重複代碼可處理物品:

List<Object> processables; 
while ((processables = retrieveProcessableItems(..)).size() > 0) { 
    // process items 
} 

但是該變量仍然必須在while循環之外聲明。

因此,我想保持我的變量作用域是乾淨的,是否可以在while條件中聲明一個變量,或者是否存在其他解決方案?

+0

有一個'do-while'循環在這種情況下聽起來像是一個很好的候選人。聲明將不得不停留在循環之外,但至少您將只有一個賦值而不是兩個賦值。 –

+0

@JaroslawPawlak - 那麼,我上面的最後一個'while'例子會有什麼不同呢? –

+0

清潔代碼。它不會在布爾表達式中隱藏賦值。 –

回答

7

您可以使用for循環寫while循環:

while (condition) { ... } 

相同

for (; condition;) { ... } 

因爲在basic for statement declaration的括號內所有三位都是可選:

BasicForStatement: 
    for ([ForInit] ; [Expression] ; [ForUpdate]) Statement 

同樣,你可以重寫y我們while環路作爲for循環:

for (List<Object> processables; 
    (processables = retrieveProcessableItems(..)).size() > 0;) { 
    // ... Process items. 
} 

需要注意的是一些靜態分析工具(如eclipse 4.5)可能要求將初始值分配給processables,例如, List<Object> processables = null。根據JLS的說法,這是不正確的;我的版本javac不會抱怨,如果該變量最初未分配。

+0

刪除你最後的想法。爲了清晰的良心,紫外線。 – Bathsheba

+0

對不起,for循環重新引入了重複代碼問題,因爲在語句的* increment *部分更新'processables'需要處理(列表 processables = retrieveProcessableItems(..); processables)。 size()> 0; processables = retrieveProcessableItems(..))' –

+0

應該不需要初始賦值爲'null'嗎? – Bathsheba

4

不,這是不可能的。

它並沒有真正太大的意義之一:不像for循環,你可以設置「循環變量」的初始狀態,在while循環您測試的現有變量的值,類似於到for循環的條件檢查

當然,如果你關心的變量「泄漏」到你的代碼的其他部分,你可以附上了整個事情的一個額外的範圍塊:

{ 
    /*declare variable here*/ 
    while(...){...} 
} 

另外,轉換while環成一個for循環。

+0

我認爲比接受的答案更好,更清潔。更具可讀性。 – rpax

+0

@rpax雖然它可能更清潔,但我只是將其視爲我的問題的解決方法。我當然知道我可以用花括號人爲地限制變量的範圍,但那不是我要求的。另一個答案更多地考慮了替代解決方案,其中'for'實際上可以替代'while'循環。 –

相關問題