在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();
}
这是个坏主意吗?有什么理由不这样做吗?它看起来比使用常规for循环更清晰。
PS-假设对于上面的示例我希望复选框显示在名称下面,该示例旨在尽可能简单地说明我的问题。
答案 0 :(得分:8)
肯定看起来很奇怪。我会更明确地说,只有 count 与for循环有关:</ p>
for (int i = 0; i < inputSrcs.size(); i++) {
System.out.println( "[ ]\t" );
}
我认为这使得意图更清晰。虽然正如评论中指出的那样,我们实际上只是在上面用另一个替换了一个“虚拟”变量。我喜欢它的是显式地调用size()
,我相信这表明大小很重要。
用更具表现力的语言,你可能会发现一些东西表明“我只是想要执行n次身体”,这样会更漂亮:
inputSrcs.size().times() {
System.out.println( "[ ]\t" );
}
(这可能是也可能不是有效的Groovy:)
编辑:另一个显而易见的答案发生在我之前,应该发生在:
printRepeatedly("[ ]\t", inputSrcs.size());
...
private static void printRepeatedly(String text, int count) {
for (int i = 0; i < count; i++) {
System.out.println(text);
}
}
现在在调用方法中,意思是绝对明显的...在printRepeatedly
内我们甚至没有拥有列表的上下文,所以我们不可能试图使用这些数据。此时,虚拟变量i
显然显然是虚拟变量,方法名称使我们想要这种行为变得明显。
答案 1 :(得分:2)
我认为如果您要这样做,评论会消除很多模糊/潜在的混淆。
答案 2 :(得分:0)
对我来说非常清楚。
你会发现println()添加的换行符 - 而不是print() - 会使你的复选框与你的左边距之外的其他任何东西都没有排列。