读书笔记之一----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、平行迭代
? 简单来说就是:
?????? 当我需要遍历集合(或数组)并且要替换(或者删除)某些元素(或者全部元素)的时候就只能用迭代器(或者索引变量)