摘要:
条款 18 提醒你注意没有设计和文档说明(针对继承)的“外来”类的子类化的危险。 那么为了继承而设计和文档说明一个类是什么意思呢? 首先,这个类必须准确地描述重写这个方法带来的影响。换句话说,该类必须文档说明可重写方法的自用性(self use)。对于每个公共或受保护的方法,文档必须指明方法调用哪些 阅读全文
摘要:
继承是实现代码重用的有效方式,但并不总是最好的工具。使用不当,会导致脆弱的软件。在一个包的内部使用继承是安全的,因为子类和父类的实现都在同一个程序员的控制之下。然而,从普通的具体类跨越包级边界继承是危险的。提醒一下,本书使用“继承”一词来表示实现继承(当一个类继承另一个类时)。在这个条款中讨论的问题 阅读全文
摘要:
不可变类是一个实例不能被修改的类。包含在每个实例中的所有信息在对象的生命周期中是固定的,因此不会观察到任何变化。Java 平台类库包含许多不可变的类,包括 String 类,基本类型包装类以及 BigInteger 类和 BigDecimal 类。使用不可变类有很多理由:不可变类比可变类更容易设计, 阅读全文
摘要:
期末复习密码学时需要用到取模运算,发现 Java 中的 % 运算符并不是取模运算(Modulo Operation),而是取余运算(Complementation)。 计算方法 对于整数 $a$,$b$ 来说,取模运算和取余运算的过程相同: 1. 求整数商:$c = a / b$ 2. 计算模或者余 阅读全文
摘要:
有时候,你可能会试图写一些退化的类(degenerate classes),除了集中实例属性之外别无用处: 因为这些类的数据属性可以直接被访问,因此这些类不提供封装的好处(条目 15)。在不更改 API 的情况下你无法更改其表示形式,无法强制执行不变量,并且在访问属性时无法执行辅助操作。坚持面向对象 阅读全文
摘要:
设计良好的组件与设计不好的组件最重要的区别就是它们隐藏内部数据和其他实现细节的程度。一个设计良好的组件隐藏了它的所有实现细节,干净地将它的 API 与实现分离开来。然后组件只通过它们的 API 进行交流,并且对彼此的内部工作一无所知。这一概念,被称为信息隐藏或封装,是软件设计的基本原则。 信息隐藏如 阅读全文
摘要:
与本章讨论的其他方法不同, 方法并没有在 类中声明。相反,它是 接口中的唯一方法。 通过实现 接口,一个类表明它的实例有一个自然序( natural ordering )。对实现 接口的对象所组成的数组排序非常简单,如下所示: 通过实现 接口,可以让你的类与所有依赖此接口的泛型算法和集合实现进行交互 阅读全文
摘要:
Cloneable 接口不包含任何方法,它只是决定了 Object 中受保护的 clone 方法的行为:如果一个类实现了 Cloneable 接口,那么 Object 的 clone 方法将返回该对象的逐个属性(field by field)拷贝;否则会抛出 异常。这是一个非常反常的接口使用,不应该 阅读全文
摘要:
虽然 Object 类提供了 toString 方法的实现,但它返回的字符串通常不是类的用户想要看到的。它由类名后跟一个 “ at ” 符号(@)和哈希码的无符号十六进制表示组成,例如 。toString 的通用约定要求,返回的字符串应该是“一个简洁但内容丰富的表示,对人们来说是很容易阅读的”。提供 阅读全文
摘要:
在每一个重写 方法的类中,都要重写 方法 。如果不这样做,你的类会违反 hashCode 的通用约定,这会阻止它在 HashMap 和 HashSet 这样的集合中正常工作。下面是根据 Object 源码改编的约定: 1. 在一个应用程序执行过程中,如果在 方法比较中没有修改任何信息,在一个对象上重 阅读全文