effective java 之通用程序设计

第一条 将局部变量的作用域最小化
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。
要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。几乎每个局部变量的声明应该包含一个初始化表达式。如果你没有足够的信息来对一个变量进行有意义的初始化,就应该推迟这个声明,直到可以初始化为止,这个条规则有个例外的情况是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 平行迭代----如果要并行的遍历多个集合,就需要显示地控制迭代器或者索引变量,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值