在Java中的for-each语句中忽略循环变量是否被认为是糟糕的样式/劝阻?
我有一些代码看起来有点像下面这样:
public void makeChecklist( final List<File> inputSrcs ){
for( File src : inputSrcs ){
System.out.print( src.getName() + "\t" );
}
System.out.println();
for( File src : inputSrcs ){
//Not using "src" in this body!
System.out.print( "[ ]\t" );
}
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
这是一个坏主意吗?有什么理由不这样做吗?它看起来比使用常规for循环更清晰.
PS-假设对于上面的例子我希望复选框出现在名称下面,这个例子被设计为尽可能简单地说明我的问题.
这当然看起来很奇怪.我会更清楚地知道,只有与for循环有关的计数:
for (int i = 0; i < inputSrcs.size(); i++) {
System.out.println( "[ ]\t" );
}
Run Code Online (Sandbox Code Playgroud)
我认为这使得意图更清晰.虽然正如评论中指出的那样,我们实际上只是在上面用另一个替换了一个"虚拟"变量.我喜欢它的是它明确调用size(),我相信这表明尺寸很重要.
用更具表现力的语言,你可能会发现一些东西表明"我只是想要执行n次身体",这仍然会更漂亮:
inputSrcs.size().times() {
System.out.println( "[ ]\t" );
}
Run Code Online (Sandbox Code Playgroud)
(这可能是也可能不是有效的Groovy :)
编辑:另一个明显的答案发生在我之前,应该发生在以前:
printRepeatedly("[ ]\t", inputSrcs.size());
...
private static void printRepeatedly(String text, int count) {
for (int i = 0; i < count; i++) {
System.out.println(text);
}
}
Run Code Online (Sandbox Code Playgroud)
现在在调用方法中,含义是绝对明显的......在printRepeatedly我们内部甚至没有列表的上下文,所以我们不可能尝试使用数据.此时虚拟变量i是相当明显的一个虚拟变量,方法名称可以显而易见的,为什么我们会想这种行为.