带你快速看完9.8分神作《Effective Java》—— 通用编程篇( 二 )


如果将类似的复制粘贴错误与for循环(for-each循环或传统循环)结合使用 , 则生成的代码就无法编译 。
for (Iterator i = c.iterator(); i.hasNext(); ) {Element e = i.next();... // Do something with e and i}...// Compile-time error - cannot find symbol ifor (Iterator i2 = c2.iterator(); i.hasNext(); ) {Element e2 = i2.next();... // Do something with e2 and i2}
for循环比while循环还有一个优点:它更短 , 增强了可读性 。
下面是另一种对局部变量的作用域最小化的循环做法:
for (int i = 0, n = expensiveComputation(); i < n; i++) {... // Do something with i;}
它有两个循环变量 , i和n , 它们都具有完全相同的作用域 。第二个变量n用于存储第一个变量的限定值 , 从而避免了每次迭代中冗余计算的代价 。
最后一种“最小化局部变量作用域”的最终技术是保持方法小而集中 。如果把两个操作()合并到同一个方法中 , 与其中一个操作相关的局部变量就有可能会出现在执行另一个操作的代码范围之内 。为了防止这种情况发生 , 只需将方法分为两个:每个操作用一个方法完成 。
58 for-each循环优先于传统的for循环
下面是一个传统的for循环来遍历一个集合:
for (Iterator i = c.iterator(); i.hasNext(); ) {Element e = i.next();... // Do something with e}
下面是数组的传统for循环的实例:
for (int i = 0; i < a.length; i++) {... // Do something with a[i]}
它们并不完美 。迭代器和索引变量都很混乱 , 好在for-each循环解决了所有这些问题 。它通过隐藏迭代器或索引变量来消除
混乱和出错的机会:
for (Element e : elements) {... // Do something with e}
此外 , 使用for-each循环也不会降低性能
当涉及到嵌套迭代时 , for-each循环相对于传统for循环的优势甚至更大 。下面是人们在进行嵌套迭代时经
常犯的一个错误:
【带你快速看完9.8分神作《Effective Java》—— 通用编程篇】enum Suit { CLUB, DIAMOND, HEART, SPADE }enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,NINE, TEN, JACK, QUEEN, KING }...static Collection suits = Arrays.asList(Suit.values