11 2018 档案
摘要:虽然 Object 类提供了 toString 方法的实现,但它返回的字符串通常不是类的用户想要看到的。它由类名后跟一个 “ at ” 符号(@)和哈希码的无符号十六进制表示组成,例如 。toString 的通用约定要求,返回的字符串应该是“一个简洁但内容丰富的表示,对人们来说是很容易阅读的”。提供
阅读全文
摘要:在每一个重写 方法的类中,都要重写 方法 。如果不这样做,你的类会违反 hashCode 的通用约定,这会阻止它在 HashMap 和 HashSet 这样的集合中正常工作。下面是根据 Object 源码改编的约定: 1. 在一个应用程序执行过程中,如果在 方法比较中没有修改任何信息,在一个对象上重
阅读全文
摘要:重写 方法看起来很简单,但是有很多方法会导致重写出错。避免此问题的最简单方法是不去重写 方法,在这种情况下,类的每个实例只与自身相等。如果满足以下任一条件,则说明不去重写是正确的做法: 每个类的实例都是固有唯一的。例如像 Thread 这样代表活动实体而不是值的类。Object 提供的 实现对这些类
阅读全文
摘要:Java 类库中包含许多必须手动调用 方法来关闭的资源, 比如 、`OutputStream java.sql.Connection`。 从以往来看,try finally 语句是保证资源正确关闭的最佳方式,即使是在程序抛出异常或返回的情况下: 这看起来并不差,但是当添加第二个资源时,情况会变得很糟
阅读全文
摘要:Finalizer 机制通常是不可预知的、危险的、不必要的。它们的使用会导致不稳定的行为,糟糕的性能和移植性问题。从 Java 9 开始,Finalizer 机制已被弃用,但仍被 Java 类库所使用。 Java 9 中 Cleaner 机制代替了 Finalizer 机制。 Cleaner 机制不
阅读全文
摘要:Java 带有垃圾回收(garbage collected)机制,这使程序员的工作变得容易了很多——因为你的对象在使用完毕以后就自动回收了。这很容易让人觉得你不需要考虑内存管理,但这并不完全正确。 考虑下面这个简单的栈实现: 这个程序没有什么明显的错误,但有一个潜在的问题——“内存泄漏”。由于垃圾回
阅读全文
摘要:通常来讲,重用一个对象比创建一个功能相同的对象更加合适。重用速度更快,并且更接近现代的代码风格。如果对象是不可变的(条款 17),它总是可以被重用。 考虑一个极端的例子: 这个语句每次执行时都会创建一个新的 String 实例,而这些实例的创建都是不必要的。如果这种用法发生在循环或者频繁调用的方法中
阅读全文
摘要:许多类都会依赖一个或多个基本资源。例如,拼写检查器依赖于字典。下面是两种错误的实现方式: 使用 static utility classes: 使用 singletons: 这两种方法都不令人满意,因为他们假设只有一本字典值得使用。在实际中,每种语言都有自己的字典,特殊的字典被用于特殊的词汇表。另外
阅读全文
摘要:偶尔你会想写一个类,这个类只是一组静态方法和静态属性。 这样的类获得了不好的名声,因为有些人滥用这些类而避免以面向对象的方式思考,但是它们有时候确实有实际的用处: 它们可以被用来聚集一组建立在基础类型或数组之上的相关方法,例如 或 。 它们也可以用于一组静态方法,用于实现某个接口的对象,例如 。 最
阅读全文
摘要:单例(singleton)就是一个只实例化一次的类。使类成为单例可能会使它的测试变得困难,因为除非它实现了作为其类型的接口,否则不可能用模拟实现来代替这个单例。下面是几种实现单例的方法: 使用 public field 方法 私有构造器只会被调用一次来初始化用 修饰的属性 。因为没有 和 的构造器,
阅读全文
摘要:静态工厂方法和构造器都有一个限制:不能很好地支持可选参数(optional parameters)很多的类。考虑一个代表包装食品上营养成分标签的类:这些标签有几个必需的属性(每份建议摄入量、每个包装所含的份数、每份的卡路里)和超过二十个可选的属性(总脂肪、饱和脂肪、反式脂肪、钠等等)。应该为这样的类
阅读全文
摘要:获取一个类的实例的传统方法是使用公开的构造器,除此之外,一个类还可以提供公开的静态工厂方法(static factory method)来返回它的实例。例如 类中的 方法,这个方法将基本类型 转换为一个 对象的引用: 注 :静态工厂方法与设计模式中的工厂方法不同。 静态工厂方法的优点: 与构造器不同
阅读全文