《Effective Java》Second Edition 第11章 序列化 后端技术

《Effective Java》Second Edition 第11章 序列化

第74条:谨慎地实现Serializable接口 如果一个类实现了Serializable接口,它的字节流编码(或者说序列化形式)就变成了它的导出的API的一部分。一旦这个类被广泛使用,往往必须永远支持这种序列化形式,就好像你必须要支持导出的API的所有其他部分一样。如果你不努力设计一种自定义的序列化形式,而仅仅接受了默认的序列化形式,这种序列化形式将被永远地束缚在该类最初的内部表示法上。换句话说,如果你接受了默认的序列化形式,这个类中私有的和包级私有的实例域将都变成导出的API的一部分,这不符合“最低限度地访问域”的实践准则,从而它就失去了作为信息隐藏工具的有效性。
阅读全文
《Effective Java》Second Edition 第10章 并发 后端技术

《Effective Java》Second Edition 第10章 并发

第66条:同步访问共享的可变数据 如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。
阅读全文
《Effective Java》Second Edition 第9章 异常 后端技术

《Effective Java》Second Edition 第9章 异常

第57条:只针对异常的情况才使用异常 因为异常机制的设计初衷是用于不正常的情形,所以很少会有JVM实现试图对它们进行优化,使得与显式的测试一样快速。 把代码放在try-catch块中反而阻止了现代JVM实现本来可能要执行的某些特定优化。 对数组进行遍历的标准模式并不会导致冗余的检查。有些现代的JVM实现会将它们优化掉。
阅读全文
《Effective Java》Second Edition 第7章 方法 后端技术

《Effective Java》Second Edition 第7章 方法

第38条:检查参数的有效性 对于公有的方法,要用Javadoc的@throws标签(tag)在文档中说明违反参数值限制时会抛出的异常。这样的异常通常为IllegalArgumentException、IndexOutOfBoundsException或NullPointerException。 对于未被导出的方法(unexported method),作为包的创建者,你可以控制这个方法将在哪些情况下被调用,因此你可以,也应该确保只将有效的参数值传递进来。因此,非公有的方法通常应该使用断言(assertion)来检查它们的参数,具体做法如下:
阅读全文
《Effective Java》Second Edition 第5章 泛型 后端技术

《Effective Java》Second Edition 第5章 泛型

第5章 泛型 在没有泛型之前,从集合中读取到的每一个对象都必须进行转换。如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。编译器自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。
阅读全文
《Effective Java》Second Edition 第4章 类和接口 后端技术

《Effective Java》Second Edition 第4章 类和接口

信息隐藏之所以非常重要有许多原因,其中大多数理由都源于这样一个事实:它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立地开发、测试、优化、使用、理解和修改。 对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别:包级私有的(package-private)和公有的(public)。如果类或者接口能够被做成包级私有的,它就应该被做成包级私有。通过把类或者接口做成包级私有,它实际上成了这个包的实现的一部分,而不是该包导出的API的一部分,在以后的发行版本中,可以对它进行修改、替换,或者删除,而无需担心会影响到现有的客户端程序。
阅读全文
《Effective Java》Second Edition 第3章 对于所有对象都通用的方法 后端技术

《Effective Java》Second Edition 第3章 对于所有对象都通用的方法

尽管Object是一个具体类,但是设计它主要是为了扩展。它所有的非final方法(equals、hashCode、toString、clone和finalize)都有明确的通用约定(general contract),因为它们被设计成是要被覆盖(override)的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用约定;如果不能做到这一点,其他依赖于这些约定的类(例如HashMap和HashSet)就无法结合该类一起正常运作。 而Comparable.compareTo虽然不是Object方法,但是本章也对它进行讨论,因为它具有类似的特征。
阅读全文
《Effective Java》Second Edition 第2章 创建和销毁对象 后端技术

《Effective Java》Second Edition 第2章 创建和销毁对象

第1条:考虑用静态工厂方法代替构造器 一个类只能有一个带有指定签名的构造器。编程人员通常知道如何避开这一限制:通过提供两个构造器,它们的参数列表只在参数类型的顺序上有所不同。实际上这并不是个好主意。面对这样的API,用户永远也记不住该用哪个构造器,结果常常会调用错误的构造器。并且,读到使用了这些构造器的代码时,如果没有参考类的文档,往往不知所云。
阅读全文
Loading...