在从事软件开发的十多年间,我曾有幸读过多种开发语言的Effective系列,如《Effective C++》、《More Effective C++》、《Effective Java》(第一版/第二版)、《Effective C#》和《More Effective C#》,单单从这一点看也算是Effective系列的忠实拥趸了。毋庸置疑,这个系列的书籍对我们研习各种开发语言的进阶都有着极为重要的意义。
在与很多初、中、高级程序员一起合作开发期间,曾多次向他们推荐经典的专业书籍,尽管每种开发语言都有着属于自己的代表作,如C++ Primer、Thinking in Java和Essential C#等,然而无一例外的是,我都会建议他们去阅读各自语言的Effective系列,因为他们确实是经典中的经典,特别是当你对该编程语言已经有了一定的开发基础和理解之后再去学习和研究书中阐述的每一个细节,就会发现书中介绍的case往往就是我们在开发中经常会用到但却又容易忽视的问题,而程序中的隐患也恰恰来自于我们的视而不见。所以我认为对于该书的阅读是应该建立在一系列的反复思考与实践之上的,可能这样的迭代过程会需要很长一段时间,然而在我看来(仅代表个人观点,如有不同,欢迎交流),它却是通向编程高手的必经之路。
OK,现在已经显而易见了,相信网友们也已经清楚了,这个系列的博客是源自《Effective Java》的读书笔记。最后,请大家继续关注本人后面的有关其他技术主题的系列博客。
Effective Java (创建和销毁对象)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/13/2228354.html
一、考虑用静态工厂方法代替构造器
二、遇到多个构造参数时要考虑用构建器(Builder模式)
三、用私有构造器或者枚举类型强化Singleton属性
四、通过私有构造器强化不可实例化的能力
五、避免创建不必要的对象
六、消除过期的对象引用
七、避免使用终结方法
Effective Java (对象通用方法)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/16/2228360.html
八、覆盖equals时请遵守通用约定
九、覆盖equals时总要覆盖hashCode
十、始终要覆盖toString
十二、考虑实现Comparable接口
Effective Java (类和接口)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2228349.html
十三、使类和成员的可访问性最小化
十四、在公有类中使用访问方法而非公有域
十五、使可变性最小化
十六、复合优先于继承
十七、要么为继承而设计,并提供文档说明,要么就禁止继承
十八、接口优先于抽象类
十九、接口只用于定义类型
二十、类层次优于标签类
二十一、用函数对象表示策略
二十二、优先考虑静态成员类
Effective Java (泛型)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/20/2228938.html
二十三、请不要在新代码中使用原生态类型
二十四、消除非受检警告
二十五、列表优先于数组
二十六、优先考虑泛型
二十七、优先考虑泛型方法
二十八、利用有限制通配符来提升API的灵活性
二十九、优先考虑类型安全的异构容器
Effective Java (枚举)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/23/2232218.html
三十、用enum代替int常量
三十一、用实例域代替序数
三十二、用EnumSet代替位域
三十三、用EnumMap代替序数索引
三十四、用接口模拟可伸缩的枚举
Effective Java (方法)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/25/2245971.html
三十八、检查参数的有效性
三十九、必要时进行保护性拷贝
四十一、谨慎重载
四十二、慎用可变参数
四十三、返回零长度的数组或者集合,而不是null
Effective Java (通用程序设计)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/27/2261576.html
四十五、将局部变量的作用域最小化
四十六、for-each循环优先于传统的for循环
四十八:如果需要精确的答案,请避免使用float和double
四十九、基本类型优先于基本装箱类型
五十一、当心字符串连接的性能
五十二、通过接口引用对象
五十三、接口优先于反射机制
五十四、谨慎地使用本地方法
Effective Java (异常)
http://www.cnblogs.com/stephen-liu74/archive/2012/01/30/2263585.html
五十七、只针对异常情况才使用异常
五十八、对可恢复的情况使用受检异常,对编程错误使用运行时异常
五十九、避免不必要的使用受检异常
六十、优先使用标准异常
六十一、抛出与抽象相对应的异常
六十三、在细节中包含能捕获失败的信息
六十四、努力使失败保持原子性
六十五、不要忽略异常
Effective Java (并发)
http://www.cnblogs.com/stephen-liu74/archive/2012/02/01/2270868.html
六十六、同步访问共享的可变数据
六十七、避免过度同步
六十八、executor和task优先于线程
六十九、并发工具优先于wait和notify
七十一、慎用延迟初始化
Effective Java (序列化)
http://www.cnblogs.com/stephen-liu74/archive/2012/02/03/2284306.html
七十五、考虑使用自定义的序列化形式
七十六、保护性的编写readObject方法