读书人

读书笔记之一-Effective Java

发布时间: 2012-11-20 09:55:43 作者: rapoo

读书笔记之一----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、平行迭代

? 简单来说就是:

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



读书人网 >其他相关

热点推荐