【问题标题】:While loop with inner assignments causing checkstyle errors带有内部分配的while循环导致checkstyle错误
【发布时间】:2013-12-22 14:24:43
【问题描述】:

我正在检查我的代码以确保它符合 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;您可以禁用内部分配检查;或者你可以删除你的内部任务。如果您想控制变量的范围,您当然可以创建一个块来定义它们并限制它们的范围,但究竟为什么呢?
  • 可以在while({})中做块吗?
  • 是的。请参阅下面的解决方案。您也可以使用匿名块。那是{ a = scanner.nextInt(); if (a != -1) System.out.print(a); }

标签: java while-loop variable-assignment


【解决方案1】:

您可以将循环重写为中间带有break 的无限循环,如下所示:

while(true) {
    int i = fileInputStream.readLine();
    if (i == -1) break;
}

请注意,i 可以在循环内移动:退出循环时它可以拥有的唯一值是 -1,因此没有理由让变量在循环外保持可见。

【讨论】:

  • 不错的建议。导致我构造了这个 for 循环: for (int i = fileInputStream.readLine(); i != -1; i = fileInputStream.readLine()) { // }
  • @DannyRancher for 循环重复 fileInputStream.readLine() 部分。我以为你的目标是避免这种重复,不是吗?
  • 其实我的目标是不要在几个地方拆分代码(你的解决方案实现了)。
  • 从干净代码的角度来看,无限循环不是更糟吗?
  • @keiki 为什么?这是一个简洁的结构,并且在命令式语言中相当普遍。事实上,在某些语言(例如 Ada)中,有一个单独的语言结构用于制造无限循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多