是否可以在条件下在Java中声明变量?

Mar*_*uer 9 java while-loop

在Java中,可以在for-loop 的初始化部分声明一个变量:

for ( int i=0; i < 10; i++) {
  // do something (with i)
}
Run Code Online (Sandbox Code Playgroud)

但随着while声明,这似乎是不可能的.

我经常看到这样的代码,当每次迭代后需要更新while循环的条件时:

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

在stackoverflow上,我发现至少有一个解决方案来防止获取可处理项的重复代码:

List<Object> processables;
while ((processables = retrieveProcessableItems(..)).size() > 0) {
    // process items
}
Run Code Online (Sandbox Code Playgroud)

但是变量仍然必须在while循环之外声明.

所以,因为我想保持我的变量范围干净,是否可以在while条件中声明变量,或者是否有其他解决方案用于此类情况?

And*_*ner 12

您可以while使用for循环编写循环:

while (condition) { ... }
Run Code Online (Sandbox Code Playgroud)

是相同的

for (; condition; ) { ... }
Run Code Online (Sandbox Code Playgroud)

因为语句声明基本括号中的所有三个位都是可选的:

BasicForStatement:
    for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
Run Code Online (Sandbox Code Playgroud)

同样,您可以将while循环重写为for循环:

for (List<Object> processables;
     (processables = retrieveProcessableItems(..)).size() > 0;) {
  // ... Process items.
}
Run Code Online (Sandbox Code Playgroud)

请注意,某些静态分析工具(例如eclipse 4.5)可能要求将初始值分配给processables,例如List<Object> processables = null.根据JLS的说法,这是不正确的; javac如果变量最初未分配,我的版本不会抱怨.

  • @Bathsheba对不起,我的意思并不像我不相信你:)就像我说的那样,我从来没有理由在[ForInit]中声明一个没有初始化的变量.尝试过,查看规格; 你当然是对的. (2认同)
  • 对我而言,这是IDE中的一个缺陷:它*应该*知道在读取内容之前*总是*被赋值给变量.那么`= null`就是这样. (2认同)

Bat*_*eba 8

不,这是不可能的.

它并没有真正太大的意义之一:不像一个for循环,你可以设置"循环变量"的初始状态,在一个while循环中,您测试的价值存在变数,类似的条件检查的的for循环.

当然,如果您担心变量"泄漏"到代码的其他部分,您可以将整个事物包含在额外的范围块中:

{
   /*declare variable here*/
   while(...){...}
}
Run Code Online (Sandbox Code Playgroud)

或者,将while循环转换为for循环.