`
sam406
  • 浏览: 57712 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

effective java 之通用程序设计

    博客分类:
  • 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 平行迭代----如果要并行的遍历多个集合,就需要显示地控制迭代器或者索引变量,
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics