Effective Java第二版和第一版的年份有很大差距,作者Joshua Bloch第一版作序时是2001年,第二版是2008年,期间Java发展很快,jdk从1.4发展到jdk6.0(Java发行版本从Java 5.0开始改为j2se5.0),Java中又增加了泛型、枚举类型、注解、自动装箱和for-each循环等新元素,作者在原来基础上把原书57个条目发展到了78个,本人比对了两版的条目,下面是各个章节的增加条目:
第2章 创建和销毁对象(Creating and Destroying Objects )
1.增加了第2条:遇到多个构造器参数时要考虑用构建器(Consider a builder when faced with many constructor parameters).
第3章 对于所有对象都通用的方法(Methods Common to All Objects)
注:第三章两版的条目没有变化。
第4章 类和接口(Classes and Interfaces)
1.增加了第14条:在公共类中使用访问方法而非公有域(In public classes,use accessor methods,not public fields);
2.增加了第20条:类层次优于标签类(Prefer class hierarchies to tagged classes);
3.增加了第21条:用函数对象表示策略(Use function objects to represent strategies).
注:原第一版第5章是C语言结构的代替(Substitutes for C Constructs)
从第二版附录中“第一版与第二版条目对照”中关于本章的对照有:
第1版条目-----------------------------
--------第2版条目
第19条:用类代替结构
----------------------第14条:在公有类中使用访问方法而非公有域
第20条:用类层次代替联合
----------------第20条:类层次优于标签类
第21条:用类代替enum结构
--------------第30条:用enum 代替int常量
第22条:用类和接口来代替函数指针-----第21条:用函数对象表示策略
对于这条目的对照因为还没有看到这个地方,也不好下结论,但从条目标题依然会让人有点疑惑
下面是上面几条的英文对照:
First Edition
---------------------------------------------------Second Edition
Item 19:Replace structures with classes
------------
Item 14:In public classes,use accessor
methods,not public fields
Item 20:Replace unions with class hierarchies
----Item 20:Prefer class hierarchies to tagged classes
Item 21:Replace enum constructs with classes
----Item 30:Use enums instead of int constants
Item 22:Replace function pointers with classes ----
Item 21:Use function objects to represent strategies
and interfaces
第1版的第19条与第2版的14条无论从原文还是翻译的比对感觉不出有什么相似之处,我看了其他章节的条目如果不需要更改的条目其题目也不会改变,不然只有把整本书看完才能知道条目之间的差异,当然阅读内容是很重要的,但是之前能了解版本更新后的显著差异,并从中得出jdk升级所带来的新的元素,我感觉能从条目中的标题体现出来是很好的。So,我是根据条目标题比对得出增加或更换。
第5章 泛型(Generics)
注:第2版第5章是新增的章节,因为之前第一版的时候还没有泛型,所以整章都是新增的条目
1.第23条:请不要在新代码中使用原生态类型(Don't use raw types in new code)
2.第24条:消除非受检警告(Eliminate unchecked warnings)
3.第25条:列表优先于数组(Prefer lists to arrays)
4.第26条:优先考虑泛型(Favor generic types)
5.第27条:优先考虑泛型方法(Favor generic methods)
6.第28条:利用有限制通配符来提升API的灵活性(Use bounded wildcards to increase API flexibility)
7.第29条:优先考虑类型安全的异构容器(Consider typesafe heterogeneous containers)
第6章 枚举和注解(Enums and Annotations)
注:枚举和注解也是jdk5.0后的概念,所以本章也是全新的条目:
1.第30条:用enum代替int常量(Use enums instead of int constants)
2.第31条:用实例域代替序数(Use instance fields instead of ordinals)
3.第32条:用EnumSet代替位域(Use EnumSet instead of bit fields)
4.第33条:用EnumMap代替序数索引(Use EnumMap instead of ordinal indexing)
5.第34条:用接口模拟可伸缩的枚举(Emulate extensible enums with interfaces)
6.第35条:注解优于命名模式(Prefer annotations to naming patterns)
7.第36条:坚持使用Override注解(Consistently use the Override annotation)
8.第37条:用标记接口定义类型(Use marker interfaces to define types)
第7章 方法(Methods)
1.增加了第42条:慎用可变参数(Use varargs judiciously)
第8章 通用程序设计(General Programming)
1.增加了第46条:for-each循环优先于传统的for循环(Prefer for-each loops to traditional for loops)
2.增加了第49条:基本类型优先于装箱基本类型(Prefer primitive types to boxed primitives)
第10章 并发(Concurrency)
注:第一版和第二版在本章节安排上有一点更改,下面列出两版的条目:
第一版:
第50条:永远不要在循环的外面调用wait(Never invoke wait outsides a loop)
第52条:线程安全性的文档化(Document thread safety)
第二版:
第68条:executor和task优先于线程(Prefer executors and tasks to threads)
第69条:并发工具优先于wait和notify(Prefer concurrency utilities to wait and notify)
第71条:慎用延迟初始化(Use lazy initialization judiciously)
第11章 序列化(Serialization)
1.增加了第78条:考虑用序列化代理代替序列化实例(Consider serialization proxies instead of serialized instances)
个人感受:Efftive Java是Java 的经典书籍之一,我感觉经典的书就需要多读沉读,这种书一般就会随着jdk的更新而从写,各个版本都拿来读一下是很好的,你能感受的其中Java的一步步成长,以及其中的丢弃和发展,本书作者Joshua Bloch是Google 的首席Java架构师,曾经是Sun公司的杰出工程师,和Transarc公司的高级系统设计师,JDK5.0语言的增强版(虽然我也不知到这是什么意思)和获奖的Java Collection Framework都是他的功劳,这么在Java领域做出卓越成就的人,现在坐下来写出自己多年来的知识和经验,
然后传送给我们每个渴求进步的学子,这是很宝贵的财富,真是需要好好利用,搜获里面关于大师各个学习积累。大师写的还有一本书是《Java 解惑》(Java Puzzlers)我刚从图书馆借到,打算不还了,嘿嘿,反正放在图书馆太可惜了。去书山淘金了。。。