01 2019 档案
摘要:有时你可能会碰到一个类,它的实例有两个或更多的风格(flavor),并且包含一个标签属性(tag field),表示实例的风格。例如下面这个类,它可以表示一个圆形或矩形: 这样的标签类有许多缺点。它们有杂乱无章的样板代码,包括枚举声明、标签属性和 switch 语句。可读性差,因为多个实现在一个类中
阅读全文
摘要:当类实现接口时,该接口会作为一种类型(type),可以被用来引用类的实例。因此,一个类实现了一个接口,就是表明客户端可以对这个类的实例做些什么。为其他目的定义接口是不合适的。 一种失败的接口就是所谓的常量接口(constant interface)。这样的接口不包含任何方法;它只包含静态 final
阅读全文
摘要:在 Java 8 之前,不可能在不破坏现有实现的情况下为接口添加方法。如果向接口添加了一个新方法,现有的实现通常会缺少该方法,从而导致编译时错误。在 Java 8 中加入了默认方法( default method)构造,目的是允许将方法添加到现有的接口。但是增加新的方法到现有的接口是充满风险的。 默
阅读全文
摘要:Java 有两种机制定义多实现类型:接口和抽象类。由于在 Java 8 中引入了接口的默认方法,因此这两种机制都允许为某些实例方法提供实现。一个主要的区别是要实现由抽象类定义的类型,该类必须是抽象类的子类。因为 Java 只允许单一继承,所以抽象类的这种局限严格限制了它作为类型定义的使用。任何定义所
阅读全文
摘要:条款 18 提醒你注意没有设计和文档说明(针对继承)的“外来”类的子类化的危险。 那么为了继承而设计和文档说明一个类是什么意思呢? 首先,这个类必须准确地描述重写这个方法带来的影响。换句话说,该类必须文档说明可重写方法的自用性(self use)。对于每个公共或受保护的方法,文档必须指明方法调用哪些
阅读全文
摘要:继承是实现代码重用的有效方式,但并不总是最好的工具。使用不当,会导致脆弱的软件。在一个包的内部使用继承是安全的,因为子类和父类的实现都在同一个程序员的控制之下。然而,从普通的具体类跨越包级边界继承是危险的。提醒一下,本书使用“继承”一词来表示实现继承(当一个类继承另一个类时)。在这个条款中讨论的问题
阅读全文
摘要:不可变类是一个实例不能被修改的类。包含在每个实例中的所有信息在对象的生命周期中是固定的,因此不会观察到任何变化。Java 平台类库包含许多不可变的类,包括 String 类,基本类型包装类以及 BigInteger 类和 BigDecimal 类。使用不可变类有很多理由:不可变类比可变类更容易设计,
阅读全文
摘要:期末复习密码学时需要用到取模运算,发现 Java 中的 % 运算符并不是取模运算(Modulo Operation),而是取余运算(Complementation)。 计算方法 对于整数 $a$,$b$ 来说,取模运算和取余运算的过程相同: 1. 求整数商:$c = a / b$ 2. 计算模或者余
阅读全文