Skip to content

wuguipeng/Effective-Java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

《Effective Java》

源代码

第二章:创建和销毁对象

本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如果避免创建对象,如果确保它们能够适时的销毁,以及如何管理对象销毁之前必须进行的各种清理。

第1条 :用静态工厂方法代替构造器

第2条: 遇到多个构造器参数时要考虑使用构建器

第3条:用私有构造器或者枚举类型强化Singleton属性

第4条:通过私有构造器强化不可实例化的能力

第5条:优先考虑依赖注入来引用资源

第6条:避免创建不必要的对象

第7条:消除过期的对象引用

第8条:避免使用终结方法和清除方法

第9条:try-with-resources优先于try-finally

第三章:对于所有对象都通用的方法

尽管Object是一个具体类,但设计它的主要目的是为了扩展。它所有的非final方法(equals、hashCode、toString、clonefinalize)都有明确的通用约定,因为它们设计成是要被覆盖的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定;如果不能做到这一点,其他依赖于这些约定的类(例如HashMapHashSet)就无法结合该类一起正常的工作。

第10条:覆盖equals时请遵守通用约定

第11条:覆盖equals是总要覆盖hashCode

第12条:始终要覆盖toString方法

第13条:谨慎的覆盖clone

第14条:考虑实现Comparable接口

第四章:类和接口

类和接口是Java编程语言的核心,它们也是Java语言的基本抽象单元。Java语言提供了许多强大的基本元素,供程序员用来设计类和接口。

第15条:使类和成员的可访问性最小化

第16条:要在共有类中使用访问方法而非公有域

第17条:使可变性最小化

第18条:复合优先于继承

第19条:要么设计继承并提供文档说明,要么禁止继承

第20条:接口优于抽象类

第21条:为后代设计接口

第22条:接口只用于定义类型

第23条:类层次优于标签类

第24条:静态成员优于非静态成员类

第25条:限制源文件为当个顶级类

第五章:泛型

从Java 5开始,泛型已经成为了Java编程的一部分。在没有泛型之前,从集合中读取一个对象都必须进行转换。如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。有了泛型之后,你可以告诉编译器每个集合中接受哪些对象类型。编译器自动为你的插入进行转换,并在编译时告知是否插入了类型错误的对象。

第26条:请不要使用原生态类型

第27条:消除非受检的警告

第28条:列表优于数组

第29条:优先考虑泛型

第30条:优先考虑泛型方法

第31条:利用有限制通配符来提升API的灵活性

第32条:谨慎并用泛型和可变参数

第33条:优先考虑类型安全的异构容器

第六章:枚举和注解

Java支持两种特殊用途的引用类型:一种是类,称作枚举类型(enum type);一种是接口,称作注解类型(annotation type)。

第34条:用enum代替int常量

第35条:用实例域代替序数

第36条:用EnumSet代替位域

第37条:用EnumMap代替序数索引

第38条:用接口模拟可扩展的枚举

第39条:注解优先于命名模式

第40条:坚持使用Overrride注解

第41条:用标记接口定义类型

第七章:Lambda和Stream

在Java中,增加了函数接口(functional interface)、Lambda和方法引用(method reference),使得创建函数对象(function object)变得很容易。于此同时,还增加了Stream API,为处理数据元素的序列提供了类库基本的支持。

第42条:Lambda优先于匿名类

第43条:方法引用优先于Lambda

第44条:坚持使用标准的函数接口

第45条:谨慎使用Stream

第46条:优先选择Stream中无副作用的函数

第47条:Stream要优先用Collection作为返回类型

第48条:谨慎使用Stream并行

第八章:方法

本章讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档。

第49条:检查参数的有效性

第50条:必要时进行保护性拷贝

第51条:谨慎设计方法签名

第52条:慎用重载

第53条:慎用可变参数

第54条:返回零长度的数组或者集合,而不是null

第55条:谨慎返回optional

第56条:为所有导出的API元素编写文档注释

第九章:通用编程

本章主要讨论Java语言的细枝末节,包含局部变量的处理、控制结构、类库的用法、各种数据类型的用法,以及两种不是由语言本身提供的机制(反射机制和本地方法)的用法。最后讨论了优化和命名惯例。

第57条:将局部变量的作用域做小化

第58条:for-each循环优先于传统的for循环

第59条:了解和使用类库

第60条:如果需要精确的答案,请避免使用float和double

第61条:基本类型优先于装箱类型

第62条:如果其他类型更合适,则尽量避免使用字符串

第63条:了解字符串连接的性能

第64条:通过接口引用对象

第65条:接口优于反射机制

第66条:谨慎使用本地方法

第67条:谨慎地进行优化

第68条:遵守普遍接受的命名惯例

第十章:异常

充分发挥异常的优点,可以提高程序的可读性、可靠性和可维护性。如果使用不当,它们也会代理负面的影响。

第69条:只针对异常的情况才是用异常

第70条:对可恢复的情况使用受检异常,对编程错误使用运行时异常

第71条:避免不必要地使用受检异常

第72条:优先使用标准的异常

第73条:抛出抽象对应的异常

第74条:每个方法抛出的所有异常都要建立文档

第75条:在细节消息中包含失败-捕获信息

第76条:努力使失败保持原子性

第77条:不要忽略异常

第十一章:并发

线程机制允许同时进行多个活动。并发程序设计比单线程程序设计要困难得多,因为有更多的东西可能出错,也很难重现失败。但是你无法避免并发,因为我们所做的大部分事情都需要并发,而且并发也是能否从多核的处理器中获得好的性能的一个条件,这些现在都是很平常的事了。本章阐述的建议可以帮助你编写出清晰、正确、文档组织良好的并发程序。

第78条:同步访问共享的可变数据

第79条:避免过度同步

第80条:executor、task和stream优先于线程

第81条:并发工具优先于wait和notify

第82条:线程安全性的文档

第82条:线程安全性文档

第83条:慎用延迟初始化

第84条:不要依赖线程调度器

第十二章:序列化

本章讨论对象序列化(object serialization),它是Java的一个框架,用来将对象编码成字节流(序列化),并从字节流编码中重新构建对象(反序列化)。一旦对象序列化之后 ,它的编码就可以从一台正在运行的虚拟机被传到另一台虚拟机上,或者被存储到磁盘上,供后续反序列化时使用。本章主要关注序列化的风险,以及如何将风险降到最低。

第85条:其他方法优先于Java序列化

第86条:谨慎地使用Serializable接口

第87条:考虑使用自定义的序列化形式

第88条:保护性地编写readObject方法

第89条:对于实例受控制,枚举类型优先于readResolve

第90条:考虑用序列化代理代替序列化实例

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published