`
bryande
  • 浏览: 8508 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • zxf_noimp: 有的拿就行了,知足吧
    无 语
  • lkj107: 建议跳过外包,直接去,何必要让人中间拦一下
    无 语
  • treblesoftware: 说个难听的话,上海有些人,宠物养护费一个月还花5500。
    无 语
  • bryande: sdao 写道你这头像一点都不低调哦 说的是你楼上吧。    ...
    无 语
  • bryande: 21xz 写道工作一年半 懂的还真不少啊,我到时候能有你一半就 ...
    无 语

读书笔记之一----Effective Java

阅读更多

再看Effective Java后,感觉自己的收获很大。

感觉此书写的确实不错,要想提高自己的编程能力此书确实是一本不错的选择。

就把书的部分内容和自己的理解记录下来吧,方便自己复习。


第45条--将局部变量的作用域最小化

      优点 :增加代码的可读性和可维护性,并降低出错的可能性。

      如何最小化 :在第一次使用的地方声明局部变量。(某些程序员习惯在代码块的开始处把所有变量都声明了,这样会引起混乱,记不清楚变量的初始化,初始值。)

在本条建议中,提及到for循环比while循环更有优势,原因很简单:for循环可以是局部变量的作用域最小化;而while循环和for循环相比是扩大了作用域。例如

for(Iterator i=c.iterator();i.hasNext();){
doSomething(i.next());  //for循环可以保证变量i的作用域在循环之内
}

Iterator i=c.iterator();
while(i.hasNext()){
     doSomething(i.next()); //while循环扩大了变量i的作用域,已经不在循环之内了
}


 

 在while扩大局部变量作用域后,犯错的可能性就更大了,比如

 

Iterator  i=c.iterator();
while (i.hasNext()){
    doSomething(i.next());
}
//粗心的程序员在ctrl+c ,ctrl+v的时候就容易犯下面的错误
Iterator  i2=c.iterator();
while (i.hasNext()){ //i.hasNext()会返回false,导致下面的代码永远不会执行
    doSomething(i2.next());//永远不会执行
}






 

 

由此可见: 良好的编程技巧及习惯是多么的重要。


第46条--for-each循环优先于传统的for循环

           原因 :1、代码更简洁 2、预防bug

这是因为迭代器和索引变量容易造成混乱,为什么这么说呢,请看下面的例子

enum  Suit { CLUB,DIAMOND,HEART,SPADE} //四种花色
enum  Rank {ACE,DEUCE,THREE,FOUR,FIVE,SIX,SEVEV,EIGHT,NINE,TEN,
JACK,QUEEN,KING}//每种花色13张牌
...

Collection<Suit>  suits=Arrays.asList(Suit.values());
Collection<Rank>  ranks=Arrays.asList(Rank.values());

List<Card>  deck= new ArrayList<Card> ();
     for   (Iterator<Suit> i=suits.iterator();i.hasNext();)
            for    (Iterator<Rank> j=ranks.iterator();i.hasNext();)
                     deck.add( new Card(i.next, j,next()));



 

 

上面的代码的意图很明显,是想生成一副扑克,但是能够达到目的吗?

令人失望的是不但达不到还会报错,这是因为i.next()调用四次之后就没有元素了。

有没有感到迭代器混乱了呢?上面的bug改起来还是比较容易的,如下

for   (Iterator<Suit> i=suits.iterator();i.hasNext();){
             Suit  suit=i.next();
             for    (Iterator<Rank> j=ranks.iterator();i.hasNext();)
                     deck.add( new Card(suit, j,next())); //生产一副扑克
            }
 

 

 传统的迭代器在多重循环的时候容易出现bug,下面再看看for-each循环吧

enum  Suit { CLUB,DIAMOND,HEART,SPADE} //四种花色
enum  Rank {ACE,DEUCE,THREE,FOUR,FIVE,SIX,SEVEV,EIGHT,NINE,TEN,
JACK,QUEEN,KING}//每种花色有13张
...

 
List<Card>  deck= new ArrayList<Card> ();
     for   (Suit suit:Suit.values())
            for    (Rank rank:Rank.values())
                     deck.add( new Card(suit, rank)); 
    


 

 

 上面的代码是不是简洁清晰些呢,也降低了出错的可能性。


  既然for-each循环既简洁,又可以预防bug那我只用for-each循环不就好了嘛?不幸的是for-each不是完美的。

  那么for-each循环在什么时候不能用呢?

  1、过滤2、转换3、平行迭代

  简单来说就是:

       当我需要遍历集合(或数组)并且要替换(或者删除)某些元素(或者全部元素)的时候就只能用迭代器(或者索引变量)



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics