本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如果避免创建对象,如果确保它们能够适时的销毁,以及如何管理对象销毁之前必须进行的各种清理。
第9条:try-with-resources优先于try-finally
尽管Object
是一个具体类,但设计它的主要目的是为了扩展。它所有的非final
方法(equals、hashCode、toString、clone
和finalize
)都有明确的通用约定,因为它们设计成是要被覆盖的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定;如果不能做到这一点,其他依赖于这些约定的类(例如HashMap
和HashSet
)就无法结合该类一起正常的工作。
类和接口是Java编程语言的核心,它们也是Java语言的基本抽象单元。Java语言提供了许多强大的基本元素,供程序员用来设计类和接口。
从Java 5开始,泛型已经成为了Java编程的一部分。在没有泛型之前,从集合中读取一个对象都必须进行转换。如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。有了泛型之后,你可以告诉编译器每个集合中接受哪些对象类型。编译器自动为你的插入进行转换,并在编译时告知是否插入了类型错误的对象。
Java支持两种特殊用途的引用类型:一种是类,称作枚举类型(enum type);一种是接口,称作注解类型(annotation type)。
在Java中,增加了函数接口(functional interface)、Lambda和方法引用(method reference),使得创建函数对象(function object)变得很容易。于此同时,还增加了Stream API,为处理数据元素的序列提供了类库基本的支持。
第47条:Stream要优先用Collection作为返回类型
本章讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档。
本章主要讨论Java语言的细枝末节,包含局部变量的处理、控制结构、类库的用法、各种数据类型的用法,以及两种不是由语言本身提供的机制(反射机制和本地方法)的用法。最后讨论了优化和命名惯例。
第60条:如果需要精确的答案,请避免使用float和double
充分发挥异常的优点,可以提高程序的可读性、可靠性和可维护性。如果使用不当,它们也会代理负面的影响。
第70条:对可恢复的情况使用受检异常,对编程错误使用运行时异常
线程机制允许同时进行多个活动。并发程序设计比单线程程序设计要困难得多,因为有更多的东西可能出错,也很难重现失败。但是你无法避免并发,因为我们所做的大部分事情都需要并发,而且并发也是能否从多核的处理器中获得好的性能的一个条件,这些现在都是很平常的事了。本章阐述的建议可以帮助你编写出清晰、正确、文档组织良好的并发程序。
第80条:executor、task和stream优先于线程
本章讨论对象序列化(object serialization),它是Java的一个框架,用来将对象编码成字节流(序列化),并从字节流编码中重新构建对象(反序列化)。一旦对象序列化之后 ,它的编码就可以从一台正在运行的虚拟机被传到另一台虚拟机上,或者被存储到磁盘上,供后续反序列化时使用。本章主要关注序列化的风险,以及如何将风险降到最低。