![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Effective
极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。
程序驿站 | ityizhan.net
这个作者很懒,什么都没留下…
展开
-
【第14条】考虑实现Comparable接口
考虑实现Comparable接口与本章中讨论的其他方法不同,compareTo方法并没有在Object 类中声明。相反,它是Comparable 接口中唯一的方法。compareTo方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外,它与Object的equals方法具有相似的特征,它还是个泛型(generic)。类实现了 Comparable接口,就表明它的实例具有内在的排序关系 (natural ordering)。为实现Comparable接口的对象数组进行排序就这么简单:Array原创 2020-11-13 17:04:02 · 266 阅读 · 0 评论 -
【第13条】谨慎地覆盖clone
谨慎地覆盖cloneCloneable接口的目的是作为对象的一个mixin接口(mixin interface)(详见第20条),表明这样的对象允许克隆(clone)。遗憾的是,它并没有成功地达到这个目的。它的主要缺陷在于缺少一个clone方法,而Object的clone方法是受保护的。如果不借助于反射(reflection)(详见第65条),就不能仅仅因为一个对象实现了Cloneable,就调用clone方法。即使是反射调用也可能会失败,因为不能保证该对象一定具有可访问的clone方法。尽管存在这样或那原创 2020-11-13 16:56:50 · 203 阅读 · 0 评论 -
【第12条】坚持覆盖toString
始终要覆盖toString虽然Object提供了 toString方法的一个实现,但它返回的字符串通常并不是类的用户所期望看到的。它包含类的名称,以及一个“@”符号,接着是散列码的无符号十六进制表示法,例如PhoneNumber@163b91。toString的通用约定指出,被返回的字符串应该是一个“简洁的但信息丰富,并且易于阅读的表达形式”。尽管有人认为 PhoneNumber@163b91算得上是简洁和易于阅读了,但是与707-867-5309比较起来,它还算不上是信息丰富的。toString约定进一原创 2020-11-10 17:14:53 · 277 阅读 · 1 评论 -
【第10条】请遵守通用约定覆盖equals
覆盖equals时请遵守通用约定覆盖 equals 方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重 最容易避免这类问题的办法就是不覆盖 equals 方法,在这种情况下,类的每个实例都只与 自身相等 如果满足了以下任何一个条件,这就正是所期望的结果:类的每个实例本质上都是唯一的。 对于代表活动实体而不是值(value)的类来说确实如 ,例如 Thread。Object 提供的 equals 实现对于这些类来说正是正确的行为。类没有必要提供“逻辑相等”( logical equa原创 2020-11-10 16:57:34 · 170 阅读 · 0 评论 -
【第9条】try-with-resources优先于try-finally
try-with-resources优先于try-finallyJava类库中包含许多必须通过调用close方法手动关闭的资源。例如InputStream,OutputStream和java.sql.Connection。客户经常会忽略资源的关闭,造成严重的性能后果也就可想而知了。虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不理想(详见第8条)。根据经验,try-finally语句是确保资源会被适时关闭的最佳方法,就算发生异常或者返回也一样// t...原创 2020-11-04 17:24:15 · 833 阅读 · 0 评论 -
【第8条】避免使用终结方法和清除方法
避免使用终结方法和清除方法最终方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。它们的使用会导致不稳定的行为,糟糕的性能和移植性问题。Finalizer机制有一些特殊的用途,我们稍后会在这个条目中介绍,但是通常应该避免它们。从Java 9开始,Finalizer机制已被弃用,但仍被Java类库所使用。Java 9中Cleaner机制代替了Finalizer机制。清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的...原创 2020-11-04 17:22:44 · 214 阅读 · 0 评论 -
【第7条】消除过期的对象引用
消除过期的对象引用当你从手工管理内存的语言(比如C或C++)转换到具有垃圾收集功能的比如Java语言时,程序员的工作会变得更加容易,因为当你用完了对象之后,它们会被自动回收。当你第一次经历对象回收功能的时候,会觉得这简直有点不可思议。它很容易给你留下这样的印象,认为自己不再需要考虑内存管理的事情了,其实不然。考虑以下简单的栈实现:// Can you spot the "memory leak"? public class Stack { private Object[] eleme.原创 2020-11-04 17:20:59 · 99 阅读 · 0 评论 -
【第6条】避免创建不必要的对象
避免创建不必要的对象一般来说,最好能重用单个对象,而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速,又流行。如果对象是不可变的(immutable)(详见第17条),它就始终可以被重用作为一个极端的反面例子,看看下面的语句:String s = new String("bikini"); // DON'T DO THIS!语句每次执行时都会创建一个新的String实例,而这些对象的创建都不是必需的。String构造方法("bikini")的参数本身就是一...原创 2020-11-04 17:20:23 · 159 阅读 · 0 评论 -
【第5条】优先考虑依赖注入来引用资源
优先考虑依赖注入来引用资源许多类依赖于一个或多个底层资源。例如,拼写检查器依赖于字典。将此类类实现为静态工具类并不少见:// Inappropriate use of static utility - inflexible & untestable! public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // Nonins...原创 2020-11-04 17:18:52 · 160 阅读 · 0 评论 -
【第4条】通过私有构造器强化不可实例化的能力
通过私有构造器强化不可实例化的能力偶尔你会想写一个只包含静态方法和静态字段的类。这些类的名声非常不好,因为有些人滥用这些类从而避免以面向对象方式思考从而编写过程化的程序,但是它们确实有着特殊的用途。它们可以用来按照java.lang.Math或java.util.Arrays的方式,把基本类型的值或数组类型上的相关方法组织起来。我们也可以通过java.util.Collections的方式,把实现特定接口上面的静态方法进行分组,也包括工厂方法。(从Java 8开始,你也可以将这些方...原创 2020-11-04 17:17:16 · 79 阅读 · 0 评论 -
【第3条】用私有构造器或者枚举类型强化Singleton属性
用私有构造器或者枚举类型强化Singleton属性单例是一个仅实例化一次的类。单例对象通常表示无状态对象,如函数或一个本质上唯一的系统组件。使类称为Singleton会使它的客户端测试变得十分困难,因为不可能给Singleton替换模拟实现,除非实现一个充当其类型的接口有两种常见的方法来实现单例。两者都基于保持构造方法私有和导出公共静态成员以提供对唯一实例的访问。在第一种方法中,成员是final修饰的属性:// Singleton with public final field pu...原创 2020-11-03 11:19:09 · 150 阅读 · 0 评论 -
【第2条】遇到多个构造器参数时要考虑使用构建器
当构造方法参数过多时使用builder模式静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。比如用一个类表示包装食品外面显示的营养成分标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里。还有超过20个的可选域:总脂肪量、饱和脂防量、转化脂防、胆固醇、钠,等等。大多数产品在某几个可选域中都会有非零的值。对于这样的类,应该用哪种构造器或者静态工厂来编写呢?程序员一向习惯采用重叠构造器(telescopingconstructor)模式,在这种模式下,提..原创 2020-11-03 11:12:13 · 209 阅读 · 0 评论 -
【第1条】用静态工厂方法代替构造器
考虑使用静态工厂方法替代构造方法一个类允许客户端获取其实例的传统方式,是提供一个公共构造方法。其实,还有另一种技术应该成为每个程序员工具箱的一部分。一个类可以提供一个简单的、只返回该类实例的公共静态工厂方法。下面是一个Boolean简单的例子( 基本类型boolean的包装类)。此方法将基本类型boolean转换为Boolean对象引用:public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Bo...原创 2020-11-03 11:03:31 · 135 阅读 · 0 评论