最近在看EffectiveJava,记录一下,分享一下自己的心得。
一、将局部变量的作用于最小化
- 在第一次使用的地方进行声明,过早的声明局部变量,会延长局部变量的生命周期,若在代码块外声明变量,当程序结束代码块后,该变量还是存在的,这并不是我们想要的结果(应该代码块结束后变量销毁)
- 当具有足够的信息进行初始化时再进行声明(try-catch代码块除外),当变量的值必须在try块的外部用到,它就必须在try块之前被声明。
- 若在循环终止之后不再需要循环变量的内容,能使用for循环就使用for循环,尽量不用while循环。for循环结束后,其局部变量全部销毁,while循环结束后,其变量可能还会存在;for循环比while循环更简洁;for循环中出现错误,程序不会通过编译,while循环中出现错误会在运行时报错。
二、for-each循环优于传统的for循环
- for-each循环不用关心容器的类型。
- for-each循环完全隐藏了迭代器或者索引变量,避免了混乱和出错的可能。
- for-each循环不仅能遍历集合和数组,还可以遍历实现Iterable接口的任何对象。
- 三种情况下无法使用for-each循环
- 解构过滤,遍历集合过程中需要删除指定的元素。
- 转换,若需要遍历列表或数组,并取代它的部分或者全部元素值,需要列表迭代器或者数组索引,便于设定元素的值
- 平行迭代,如果需要并行地遍历多个集合,就要显式的控制迭代器或者索引变量。
平行迭代的例子:
enum Num{ONE,TWO,THREE,FOUR,FIVE,SIX} ... Cllection<Num> nums= EnumSet.allOf(Num.class); for (Iterator<Num> i = nums.iterator();i.hasNext();) for(Iterator<Num> j = nums.iterator();j.hasNext();) System.out.println(i.next()+" "+j.next());
输出结果为:
ONE ONE
TWO TWO
THREE THREE
FOUR FOUR
FIVE FIVE
SIX SIX
此处需要注意:如此循环并不会输出6*6个结果,并且若外层遍历的容器中元素个数少于内层遍历的容器中元素个数,则会抛出NoSuchElementException异常。
参考:《Effective java》P219~P224