再看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、平行迭代
简单来说就是:
当我需要遍历集合(或数组)并且要替换(或者删除)某些元素(或者全部元素)的时候就只能用迭代器(或者索引变量)
分享到:
相关推荐
Effective-Java读书笔记,别人分享的
effective java 读书笔记,第二版自己摘要并翻译,以备速查。
Effective Java读书笔记.pdf
基于Effective Java第二版的读书笔记,可以帮助你更好的阅读这边Java圣经,更快的理解其思想
2021年EFFECTIVEJAVA读书笔记.docx
【Effective Java】阅读笔记markdown 文件
Effective Java读书笔记,记载了大部分我觉的有用的东西,前半部分有代码说明,但后半部分的代码,太过琐碎,就没有整理
java8集合源码有效的 Kotlin - 示例 免责声明:这个存储库包含我在阅读优秀书籍 Effective Kotlin 时收集的个人笔记和示例。 它绝不是本书的摘录或副本。 我鼓励所有 Kotlin 开发人员购买和阅读这本书。 第 1 部分:...
java软件笔试题 my notebook 我的笔记本,大部分是在大二大三的时候写的笔记,对于已经毕业的来说可能比较基础甚至naive。...7:读书笔记 thinking in java effective java Android开发艺术探索 Android插件化开发指南
安卓艺术开发探索读书笔记,EffectiveJava读书笔记. 收集各大神博客以及安卓笔记,安卓面试笔记等方便手机端查看. 更新说明 v2.2.2 1.增加了一些最近在学习比较好的安卓大神的博客. 2.增加了来自GeniusVJR整理的安卓...
loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 ...读书笔记 Effective Java , HTTP权威指南 , Java
Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...
作者HotBitmapGG,源码StudyProject,一款 Material Design 风格的 AndroidRank 干货学习客户端,需要...安卓艺术开发探索读书笔记,EffectiveJava 读书笔记. 收集各大神博客以及安卓笔记,安卓面试笔记等方便手机端查看.