第一条 将局部变量的作用域最小化
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。
要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。几乎每个局部变量的声明应该包含一个初始化表达式。如果你没有足够的信息来对一个变量进行有意义的初始化,就应该推迟这个声明,直到可以初始化为止,这个条规则有个例外的情况是try-catch语句。如果一个变量被一个方法初始化,而这个方法可能会抛出一个受检的异常(checked exception),该变量就必须在try块的内部被初始化。如果变量的值必须在try块外的被使用到,它就必须在try块的外部声明, 循环中提供了特殊的机会来将变量的作用域最小化,如果在循环终止之后不再需要循环变量的内容,for 循环优于whlile
实例1
实例2
为了弄清楚为什么这个for循环优于while。下列有两代码片段
第二个循环中包含一个“copy--past”错误,它本来要初始化一个循环变量c2.却使用了旧的循环变量i,遗憾的是。这个i仍然在有效的范围内。结果代码可以通过编译,运行的时候也不会抛出异常,但是它所做的却是错误的,第二个循环却没有在c2上迭代,而是立即终止,因为这个程序是悄然发生的,所以很长一段时间是不会发现的, 如果类似“copy-past”错误发生在前面任何for循环中,结果代码就根本不能通过编译,在第二个循环开始之前,第一个循环元素的变量已经不在它的作用域范围之内了:
//编译错误
......
使用for循环与使用while还有一个优势:更简短,从而增强了可读性。
最后一种“将局部比那里的作用域最小化”的方法是使方法小而集中。
第二条 for-each 循环优于for循环
三种情况不易使用for-each循环
1 过滤----如果需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用它的
remove方法
2 转换---如果需要遍历列表或数组并取代她部分或全部元素值,就需要列表迭代器或者数组索引
,以便设定元素的值
3 平行迭代----如果要并行的遍历多个集合,就需要显示地控制迭代器或者索引变量,
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。
要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。几乎每个局部变量的声明应该包含一个初始化表达式。如果你没有足够的信息来对一个变量进行有意义的初始化,就应该推迟这个声明,直到可以初始化为止,这个条规则有个例外的情况是try-catch语句。如果一个变量被一个方法初始化,而这个方法可能会抛出一个受检的异常(checked exception),该变量就必须在try块的内部被初始化。如果变量的值必须在try块外的被使用到,它就必须在try块的外部声明, 循环中提供了特殊的机会来将变量的作用域最小化,如果在循环终止之后不再需要循环变量的内容,for 循环优于whlile
实例1
for(Element e:c){
doSomething(e);
}
实例2
for(Iterator i=c.iterator();i.hasNext){
doSomething(i.next());
}
为了弄清楚为什么这个for循环优于while。下列有两代码片段
Iterator<Element> i=c.iterator();
while(i.hasNext()){
doSomething(i.next());
}
....
Iterator<Element> i2=c2.iterator();
while(i.hasNext()){
doSomething(i2.next());
}
第二个循环中包含一个“copy--past”错误,它本来要初始化一个循环变量c2.却使用了旧的循环变量i,遗憾的是。这个i仍然在有效的范围内。结果代码可以通过编译,运行的时候也不会抛出异常,但是它所做的却是错误的,第二个循环却没有在c2上迭代,而是立即终止,因为这个程序是悄然发生的,所以很长一段时间是不会发现的, 如果类似“copy-past”错误发生在前面任何for循环中,结果代码就根本不能通过编译,在第二个循环开始之前,第一个循环元素的变量已经不在它的作用域范围之内了:
for(Iterator<Element> i=c.iterator();i.hasNext()){
doSomething(i.next());
}
....
//编译错误
for(Iterator<Element> i2=c2.iterator();i.hasNext()){
doSomething(i2.next());
}
......
使用for循环与使用while还有一个优势:更简短,从而增强了可读性。
for(int i=0;n=expensvie();i<n;i++){
doSomething(i);
}
最后一种“将局部比那里的作用域最小化”的方法是使方法小而集中。
第二条 for-each 循环优于for循环
三种情况不易使用for-each循环
1 过滤----如果需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用它的
remove方法
2 转换---如果需要遍历列表或数组并取代她部分或全部元素值,就需要列表迭代器或者数组索引
,以便设定元素的值
3 平行迭代----如果要并行的遍历多个集合,就需要显示地控制迭代器或者索引变量,