内部赋值的while循环导致checkstyle错误。

4
我正在检查我的代码,以确保符合CheckStyle标准。
我个人认为规则“不允许内部赋值”会使代码更加复杂难懂(需要查看3个位置而不是1个)。
是否有一种方法可以通过在while循环中创建{}块来执行我的赋值并返回布尔值,以保留单个区域?!
你有什么想法?
File file = new File("C:\\test.txt");
FileInputStream fileInputStream = new FileInputStream(new FileInputStream(file));

// Inner Assignment
while ((int i = fileInputStream.readLine()) != -1)
{
  //
}

// No Inner Assignment
int i = fileInputStream.readLine();
while(i!= -1)
{
  //
  i = in.readLine();
}

当我需要使用while循环来分配一些变量的组合时,例如使用++运算符时,我会遇到类似的问题。

这个for循环是否被认为是更好的选择(它符合checkstyle)?

for (int i = fileInputStream.readLine(); i != -1; i = fileInputStream.readLine())
{
  //
}

你在问什么?你可以选择不使用checkstyle;你可以禁用内部赋值检查;或者你可以删除内部赋值。如果你想控制变量的作用域,你当然可以创建一个块来定义它们并限制它们的作用域,但为什么呢? - Elliott Frisch
能否使用while({})语句块? - Danny Rancher
是的。请看下面的解决方案。您也可以使用匿名块。即{ a = scanner.nextInt(); if (a != -1) System.out.print(a); } - Elliott Frisch
1个回答

4
你可以将循环重写为一个无限循环,并在中间使用 break,像这样:
while(true) {
    int i = fileInputStream.readLine();
    if (i == -1) break;
}

请注意,i可以移动到循环内部:在退出循环时它唯一可能的值是-1,所以没有必要将变量保留在循环外可见。

好的建议。让我构建了这个for循环: for (int i = fileInputStream.readLine(); i != -1; i = fileInputStream.readLine()) { // } - Danny Rancher
@DannyRancher for 循环重复执行 fileInputStream.readLine() 部分。我以为你的目标是避免这种重复,不是吗? - Sergey Kalinichenko
我的目标实际上是不要将代码分散在多个地方(而你的解决方案却做到了这一点)。 - Danny Rancher
从代码的角度来看,无限循环不是更糟糕吗? - keiki
@keiki 为什么?这是一个干净的构造,而且在命令式语言中相当常见。实际上,在某些语言中(例如 Ada),有一个单独的语言结构用于制作无限循环。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接