Java “替代方案”;而";环
我正在寻找一个更好的替代下面的代码。假设一些常用的编程语言(C/C++、java等): (一)Java “替代方案”;而";环,java,Java,我正在寻找一个更好的替代下面的代码。假设一些常用的编程语言(C/C++、java等): (一) 不好,因为使用了一个循环,一个中断可能会在某些代码的中间丢失。 (二) 不太好,因为对“foo”的赋值是重复的。在本例中相同: 2b) (三) “转到”到一个循环的中间 (四) 条件是重复的 奇怪的是,如此普通的东西没有很好的实现。通常是通过以下方式实现的: Foo foo; while ((foo = getSmthUgly()) != null) { //... } 赋值运算符=的结果只
不好,因为使用了一个循环,一个中断可能会在某些代码的中间丢失。
(二) 不太好,因为对“foo”的赋值是重复的。在本例中相同: 2b) (三) “转到”到一个循环的中间 (四) 条件是重复的奇怪的是,如此普通的东西没有很好的实现。通常是通过以下方式实现的:
Foo foo;
while ((foo = getSmthUgly()) != null) {
//...
}
赋值运算符
=
的结果只是赋值,所以它也可以在表达式中使用。将任何丑陋的东西放入单独的方法中。通常通过以下方式完成:
Foo foo;
while ((foo = getSmthUgly()) != null) {
//...
}
赋值运算符
=
的结果只是赋值,所以它也可以在表达式中使用。任何丑陋的东西都放在单独的方法中。类似于Sasha的解决方案,除了我赞成使用for
来限制变量的范围之外。例如,从BufferedReader读取行时
try (BufferedReader br = new BufferedReader(new FileReader(filename)) {
for(String line; (line = br.readLine()) != null; ) {
doSomething(line);
}
// line is out of scope here.
}
与Sasha的解决方案类似,只是我倾向于使用
for
来限制变量的范围。例如,从BufferedReader读取行时
try (BufferedReader br = new BufferedReader(new FileReader(filename)) {
for(String line; (line = br.readLine()) != null; ) {
doSomething(line);
}
// line is out of scope here.
}
选项4有什么问题?选项1有什么问题?@biziclop:condition“foo!=null”必须重复。如果条件更复杂,或者是对另一个函数的调用,这可能是一个问题。@pasabaporaqui由于两个条件不同,所以它不会重复。一个是处理的条件,另一个是留在循环中的条件。在您的案例中,这两个可能相似只是巧合,从逻辑上讲,它们是两个独立的条件。@SLaks:假设“foo”的初始化需要不止一行的内容(例如,初始化Java PrinterWriter BufferedStram时,通常使用多个“new”语句)。在这种情况下,断点在源的中间丢失。选项4有什么不对?选项1有什么不对?@ BIZICLOP:条件“FoO!= NULL”必须复制。如果条件更复杂,或者是对另一个函数的调用,这可能是一个问题。@pasabaporaqui由于两个条件不同,所以它不会重复。一个是处理的条件,另一个是留在循环中的条件。在您的案例中,这两个可能相似只是巧合,从逻辑上讲,它们是两个独立的条件。@SLaks:假设“foo”的初始化需要不止一行的内容(例如,初始化Java PrinterWriter BufferedStram时,通常使用多个“new”语句)。在这种情况下,Bebug在源代码中间丢失。在C/C++中,我认为java中不可能。@ PasabPaRaQui绝对是可能的。@ PasabPaRaQui为什么java中不可能这样做。只要getSmthUgly不太难看,这可能是最好的解决方案。好的,这可能是最好的,当init to“foo”需要多个语句时,会出现另一个问题。@pasabaporaqui然后可以使用函数,如C/C++中的
getSmthUgly()
True,我认为在Java中是不可能的。@pasabaporaqui绝对可能。@pasabaporaqui为什么在Java中不可能呢。只要getSmthUgly不太难看,这可能是最好的解决方案。好的,这可能是最好的,当init to“foo”需要多个语句时会出现另一个问题。@pasabaporaqui然后您可以使用函数,如getSmthUgly()
很高兴知道“for”的第一部分只能用于声明局部变量,不带init。很高兴知道“for”的第一部分只能用于声明局部变量,而不带init。
do {
foo = ... something ugly ...
if( foo != null ) {
... some code
}
} while ( foo != null )
Foo foo;
while ((foo = getSmthUgly()) != null) {
//...
}
try (BufferedReader br = new BufferedReader(new FileReader(filename)) {
for(String line; (line = br.readLine()) != null; ) {
doSomething(line);
}
// line is out of scope here.
}