有条件时是否可以在Java中声明变量?
在Java中,可以在有条件时是否可以在Java中声明变量?,java,while-loop,Java,While Loop,在Java中,可以在for循环的初始化部分声明变量: for ( int i=0; i < 10; i++) { // do something (with i) } 在stackoverflow上,我发现至少可以防止获取可处理项的重复代码: List<Object> processables; while ((processables = retrieveProcessableItems(..)).size() > 0) { // process item
for
循环的初始化部分声明变量:
for ( int i=0; i < 10; i++) {
// do something (with i)
}
在stackoverflow上,我发现至少可以防止获取可处理项的重复代码:
List<Object> processables;
while ((processables = retrieveProcessableItems(..)).size() > 0) {
// process items
}
列出可处理内容;
while((processables=retrieveProcessableItems(..).size()>0){
//处理项目
}
但是变量仍然必须在while循环之外声明
因此,为了保持变量范围干净,是否可以在while条件中声明变量,或者是否有其他解决方案用于此类情况?不可能
它也没有太大的意义:不像for
循环可以设置“循环变量”的初始状态,在循环中测试现有变量的值,类似于for
循环的条件检查
当然,如果您担心变量“泄漏”到代码的其他部分,您可以将整个过程包含在一个额外的作用域块中:
{
/*declare variable here*/
while(...){...}
}
或者,将while
循环转换为for
循环。您可以使用for
循环编写while
循环:
while (condition) { ... }
for (List<Object> processables;
(processables = retrieveProcessableItems(..)).size() > 0;) {
// ... Process items.
}
与
for (; condition; ) { ... }
由于括号中的所有三位都是可选的:
BasicForStatement:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
类似地,您可以将while
循环重写为for
循环:
while (condition) { ... }
for (List<Object> processables;
(processables = retrieveProcessableItems(..)).size() > 0;) {
// ... Process items.
}
用于(列出可处理内容;
(processables=retrieveProcessableItems(..).size()>0;){
//…处理项目。
}
请注意,一些静态分析工具(例如eclipse 4.5)可能要求将初始值分配给processables
,例如List processables=null
。根据JLS,这是不正确的;我的javac
版本不会抱怨变量最初没有赋值。破坏了你的上一个想法。抱歉,for循环重新引入了重复代码问题,因为必须更新语句增量部分中的processables
:for(List processables=retrieveProcessableItems(..);processables.size()>0;processables=retrieveProcessableItems(..)
@Bathsheba对不起,我不是故意说我不相信你:)就像我说的,我从来没有理由在[ForInit]中声明一个没有初始化的变量。试过了,检查了规格;当然,你是对的。对我来说,这是IDE的一个缺陷:它应该知道在读取变量的内容之前,总是给变量赋值=null
然后就是了。@Bathsheba我把它作为一个单独的点移了出来,所以更容易阅读“无误”的答案。谢谢。在这种情况下,有一个do-while
循环听起来是个不错的选择。声明必须留在循环之外,但至少您只有一个赋值,而不是两个。@JaroslawPawlak-那么,与我的最后一个,而上面的示例的区别在哪里?更干净的代码。它不会在布尔表达式中隐藏赋值。@JaroslawPawlak您能用一个例子给出答案吗?现在我无法想象你的意思。我认为这比公认的答案更好更干净。可读性强得多。@rpax虽然可能更简洁,但我只是将其视为解决问题的一种方法。我当然知道我可以用大括号人为地限制变量的范围,但这不是我想要的。另一个答案更多地集中在使用for
的替代解决方案上,它实际上可以替代while
循环。