阿里内部学习指南《Effective Java中文 第3版》程序员进阶必备

Java 同时被 3 个专栏收录
1266 篇文章 1 订阅
1298 篇文章 4 订阅
1205 篇文章 0 订阅

Java从1997年诞生到日趋完善,经过了20多年不断的发展壮大,已经拥有了近千万开发人员。如何编写出更清晰、更正确、更健壮且更易于重用的代码,是大家所追求的目标。

经典Jolt获奖作品《Effective Java》的第3版这本书,对上一版内容进行了彻底的更新,介绍了如何充分利用从泛型到枚举、从注解到自动装箱的各种特性,帮助读者更加有效地使用Java编程语言及其基本类库: java.lang. java.util和java.io,以及子包,如java.util. concurrent和java.util.function等。

 

本书的作者Joshua .Bloch曾经是Sun公司的杰出工程师和Google公司的首席Java架构师,带领团队设计和实现过无数的Java平台特性,在本书中,他为我们带来了90条程序员必备的经验法则:针对你每天都会遇到的编程问题提出了最有效、最实用的解决方案

对于Java 平台精妙之处的独到见解,并提供优秀的代码范例。通过阅读贯穿全书的透彻的技术剖析与完整的示例代码,认真理解并加以实践,必定会从中受益匪浅。书中介绍的示例代码清晰易懂,也可以作为日常工作的参考指南

本文档会免费分享给大家,需要获取学习的朋友,请帮忙分享,私信“Java”就能获得领取方式哦

本书分为12章共90个条目,涵盖了Java 5.0/6.0/ 7.0/ 8.0/ 9.0的种种技术要点。

第1章 引言

 

第2章 阐述何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清除动作。

  • 用静态工厂方法代替构造器
  • 遇到多个构造器参数时要考虑使用构建器
  • 用私有构造器或者枚举类型
  • 强化Singleton属性
  • 通过私有构造器强化不可实例化的能力
  • 优先考虑依赖注人来引用资源
  • 避免创建不必要的对象
  • 消除过期的对象引用
  • 避免使用终结方法和清除方法
  • ty-with-resource优先于try-finally

 

 

 

第3章 阐述对于所有对象都通用的方法,你会从中获知对equals, hashCode, toString,clone、finalize 以及Comparable .compareTo方法相当深入的分析,从而避免今后在这些问题上再次犯错。

  • 覆盖equals时请遵守通用约定
  • 覆盖equals时总要覆盖hashCode
  • 始终要覆盖toString
  • 谨慎地覆盖clone
  • 考虑实现Comparable接口

 

第4章 阐述作为Java程序设计语言的核心以及Java语言的基本抽象单元(类和接口)在使用上的一些指导原则,帮助你更好地利用这些元素,设计出更加有用、健壮和灵活的类与接口。

  • 使类和成员的可访问性最小化
  • 要在公有类而非公有域中使用访问方法
  • 使可变性最小化
  • 复合优先于继承
  • 要么设计继承并提供文档说明,要么禁止继承
  • 接口优于抽象类
  • 为后代设计接口
  • 接口只用于定义类型
  • 类层次优于标签类
  • 静态成员类优于非静态成员类
  • 限制源文件为单个顶级类

 

 

 

第5章和第6章中 分别阐述在Java1.5发行版本中新增加的泛型(Generic)以及枚举( Enum)和注解( Annotation)的最佳实践,教你如何最大限度地享有这些优势,并使整个过程尽可能地简单化。

  • 请不要使用原生态类型
  • 消除非受检的警告
  • 列表优于数组
  • 优先考虑泛型
  • 优先考虑泛型方法
  • 利用有限制通配符来提升API的灵活性
  • 谨慎并用泛型和可变参数
  • 优先考虑类型安全的异构容器

 

  • 用enum代替int常量
  • 用实例域代替序数
  • 用EnumSet代替位域
  • 用EnumMap代替序数索引
  • 用接口模拟可扩展的枚举
  • 注解优先于命名模式
  • 坚持使用Override注解
  • 用标记接口定义类型

 

第7章 专门讨论在Java 8中新增的函数接口( Functional Interface). Lambda 表达式和方法引用( Method Reference),使创建函数对象( Function Object)变得更加容易。接着探讨为处理数据元素的序列提供了类库级别支持的Stream API,以及如何最佳地利用这些机制。

  • Lambda优先于匿名类
  • 方法引用优先于Lambda
  • 坚持使用标准的函数接口
  • 谨慎使用Stream
  • 优先选择Stream中无副作用的函数
  • Stream要优先用Collection作为返回类型
  • 谨慎使用Stream并行

本文档会免费分享给大家,需要获取学习的朋友,请帮忙分享,私信“Java”就能获得领取方式哦

第8章 讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档,从而使方法设计在可用性、健壮性和灵活性上有进一步的提升。

  • 检查参数的有效性
  • 必要时进行保护性拷贝
  • 谨慎设计方法签名
  • 慎用重载
  • 慎用可变参数
  • 返回零长度的数组或者集合而不是null
  • 谨慎返回optinal
  • 为所有导出的API元素
  • 编写文档注释

 

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

  • 将局部变量的作用域最小化
  • for-each循环优先于传统的for循环
  • 了解和使用类库
  • 如果需要精确的答案,请避免使用float和double
  • 基本类型优先于装箱基本类型
  • 如果其他类型更适合,则尽量避免使用字符串
  • 了解字符串连接的性能
  • 通过接口引用对象
  • 接口优先于反射机制
  • 谨慎地使用本地方法
  • 谨慎地进行优化
  • 遵守普遍接受的命名惯例

 

 

 

第10章 阐述如何充分发挥异常的优点来提高程序的可读性、可靠性和可维护性,以及减少异常使用不当所带来的负面影响,并提供了一些关于有效使用异常的指导原则。

  • 只针对异常的情况才使用异常
  • 对可恢复的情况使用受检异常,对编程错误使用运行时异常
  • 避免不必要地使用受检异常
  • 优先使用标准的异常
  • 抛出与抽象对应的异常
  • 每个方法抛出的所有异常都要建立文档
  • 在细节消息中包含失败捕获信息
  • 努力使失败保持原子性
  • 不要忽略异常

 

 

第11章 阐述如何帮助你编写出清晰、正确、文档组织良好的并发程序,比如如何避免过度同步,优先采用Executor Framework.并发集合(ConcurrentCollection)、同步器(Synch-ronizer),以及是否需要依赖于线程调度器等。

  • 同步访问共享的可变数据
  • 避免过度同步
  • executor、task 和stream优先于线程
  • 并发工具优先于wait和线程安全性的文档化
  • 慎用延迟初始化
  • 不要依赖于线程调度器

 

第12章 阐述序列化方面的技术,并且有一项值得特别提及的特性,就是序列化代理( Serialization Proxy)模式,它可以帮助你避免对象序列化的许多缺陷。

  • 其他方法优先于Java序列化
  • 谨慎地实现Serializable接口
  • 考虑使用自定义的序列化形式
  • 保护性地编写readObject方法
  • 对于实例控制,枚举类型优先于readResolve
  • 考虑用序列化代理代替序列化实例

本文档会免费分享给大家,需要获取学习的朋友,请帮忙分享,私信“Java”就能获得领取方式哦

由于篇幅限制,小编只能在这里给大家展示文章目录及部分内容,以避免影响大家的阅读体

最后,希望大家都可以进大厂

  • 2
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
effective java 中文第三 pdf文件下载 目录 01. 考虑使用静态工厂方法替代构造方法.md 02. 当构造方法参数过多时使用builder模式.md 03. 使用私有构造方法或枚类实现Singleton属性.md 04. 使用私有构造方法执行非实例化.md 05. 使用依赖注入取代硬连接资源(hardwiring resources).md 06. 避免创建不必要的对象.md 07. 消除过期的对象引用.md 08. 避免使用Finalizer和Cleaner机制.md 09. 使用try-with-resources语句替代try-finally语句.md 10. 重写equals方法时遵守通用约定.md 11. 重写equals方法时同时也要重写hashcode方法.md 12. 始终重写 toString 方法.md 13. 谨慎地重写 clone 方法.md 14. 考虑实现Comparable接口.md 15. 使类和成员的可访问性最小化.md 16. 在公共类中使用访问方法而不是公共属性.md 17. 最小化可变性.md 18. 组合优于继承.md 19. 如使用继承则设计,应当文档说明,否则不该使用.md 20. 接口优于抽象类.md 21. 为后代设计接口.md 22. 接口仅用来定义类型.md 23. 优先使用类层次而不是标签类.md 24. 优先考虑静态成员类.md 25. 将源文件限制为单个顶级类.md 26. 不要使用原始类型.md 27. 消除非检查警告.md 28. 列表优于数组.md 29. 优先考虑泛型.md 30. 优先使用泛型方法.md 31. 使用限定通配符来增加API的灵活性.md 32. 合理地结合泛型和可变参数.md 33. 优先考虑类型安全的异构容器.md 34. 使用枚举类型替代整型常量.md 35. 使用实例属性替代序数.md 36. 使用EnumSet替代位属性.md 37. 使用EnumMap替代序数索引.md 38. 使用接口模拟可扩展的枚举.md 39. 注解优于命名模式.md 40. 始终使用Override注解.md 41. 使用标记接口定义类型.md 42. lambda表达式优于匿名类.md 43. 方法引用优于lambda表达式.md 44. 优先使用标准的函数式接口.md 45. 明智审慎地使用Stream.md 46. 优先考虑流中无副作用的函数.md 47. 优先使用Collection而不是Stream来作为方法的返回类型.md 48. 谨慎使用流并行.md 49. 检查参数有效性.md 50. 必要时进行防御性拷贝.md 51. 仔细设计方法签名.md 52. 明智审慎地使用重载.md 53. 明智审慎地使用可变参数.md 54. 返回空的数组或集合,不要返回 null.md 55. 明智审慎地返回 Optional.md 56. 为所有已公开的 API 元素编写文档注释.md 57. 最小化局部变量的作用域.md 58. for-each 循环优于传统 for 循环.md 59. 了解并使用库.md 60. 若需要精确答案就应避免使用 float 和 double 类型.md 61. 基本数据类型优于包装类.md 62. 当使用其他类型更合适时应避免使用字符串.md 63. 当心字符串连接引起的性能问题.md 64. 通过接口引用对象.md 65. 接口优于反射.md 66. 明智审慎地本地方法.md 67. 明智审慎地进行优化.md 68. 遵守被广泛认可的命名约定.md 69. 只针对异常的情况下才使用异常.md 70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常.md 71. 避免不必要的使用受检异常.md 72. 优先使用标准的异常.md 73. 抛出与抽象对应的异常.md 74. 每个方法抛出的异常都需要创建文档.md 75. 在细节消息中包含失败一捕获信息.md 76. 保持失败原子性.md 77. 不要忽略异常.md 78. 同步访问共享的可变数据.md 79. 避免过度同步.md 80. executor 、task 和 stream 优先于线程.md 81. 相比 wait 和 notify 优先使用并发工具.md 82. 文档应包含线程安全属性.md 83. 明智审慎的使用延迟初始化.md 84. 不要依赖线程调度器.md 85. 优先选择 Java 序列化的替代方案.md 86. 非常谨慎地实现 Serializable.md 87. 考虑使用自定义的序列化形式.md 88. 保护性的编写 readObject 方法.md 89. 对于实例控制,枚举类型优于 readResolve.md 90. 考虑用序列化代理代替序列化实例.md
序 前言 致谢 第1章 引言 第2章 创建和销毁对象 第1条:考虑用静态工厂方法代替构造器 第2条:遇到多个构造器参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 第4条:通过私有构造器强化不可实例化的能力 第5条:避免创建不必要的对象 第6条:消除过期的对象引用 第7条:避免使用终结方法 第3章 对于所有对象都通用的方法 第8条:覆盖equals时请遵守 通用约定 第9条:覆盖equals时总要覆盖hashCode 第10条:始终要覆盖toString 第11条:谨慎地覆盖clone 第12条:考虑实现Comparable接口 第4章 类和接口 第13条:使类和成员的可访问性最小化 第14条:在公有类中使用访问方法而非公有域 第15条:使可变性最小化 第16条:复合优先于继承 第17条:要么为继承而设计,并提供文档说明,要么就禁止继承 第18条:接口优于抽象类 第19条:接口只用于定义类型 第20条:类层次优于标签类 第21条:用函数对象表示策略 第22条:优先考虑静态成员类 第5章 泛型 第23条:请不要在新代码中使用原生态类型 第24条:消除非受检警告 第25条:列表优先于数组 第26条:优先考虑泛型 第27条:优先考虑泛型方法 第28条:利用有限制通配符来提升API的灵活性 第29条:优先考虑类型安全的异构容器 第6章 枚举和注解 第30条:用enum代替int常量 第31条:用实例域代替序数 第32条:用EnumSet代替位域 第33条:用EnumMap代替序数索引 第34条:用接口模拟可伸缩的枚举 第35条:注解优先于命名模式 第36条:坚持使用Override注解 第37条:用标记接口定义类型 第7章 方法 第38条:检查参数的有效性 第39条:必要时进行保护性拷贝 第40条:谨慎设计方法签名 第41条:慎用重载 第42条:慎用可变参数 第43条:返回零长度的数组或者集合,而不是:null 第44条:为所有导出的API元素编写文档注释 第8章 通用程序设计 第45条:将局部变量的作用域最小化 第46条:for-each循环优先于传统的for循环 第47条:了解和使用类库 第48条:如果需要精确的答案,请避免使用float和double 第49条:基本类型优先于装箱基本类型 第50条:如果其他类型更适合,则尽量避免使用字符串 第51条:当心字符串连接的性能 第52条:通过接口引用对象 第53条:接口优先于反射机制 第54条:谨慎地使用本地方法 第55条:谨慎地进行优化 第56条:遵守普遍接受的命名惯例 第9章 异常 第57条:只针对异常的情况才使用异常 第58条:对可恢复的情况使用受检异常,对编程错误使用运行时异常 第59条:避免不必要地使用受检的异常 第60条:优先使用标准的异常 第61条:抛出与抽象相对应的异常 第62条:每个方法抛出的异常都要有文档 第63条:在细节消息中包含能捕获失败的信息 第64条:努力使失败保持原子性 第65条:不要忽略异常 第10章 并发 第66条:同步访问共享的可变数据 第67条:避免过度同步 第68条:executor和task优先干线程 第69条:并发工具优先于wait和notify 第70条:线程安全性的文档化 第71条:慎用延迟初始化 第72条:不要依赖于线程调度器 第73条:避免使用线程组 第11章 序列化 第74条:谨慎地实现Serializable接口 第75条:考虑使用自定义的序列化形式 第76条:保护性地编写readObject方法 第77条:对于实例控制,枚举类型优先于readResolve 第78条:考虑用序列化代理代替序列化实例 附录 第1与第2条目对照
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页

打赏

mrchaochao

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值