Object 常用方法

equals

如果一个对象的属性可能为null,实现Object.equals()就有点麻烦了,因为要单独的检查null的情况。使用Objects.equal()可以在可能为null的情况下执行equals判断而不抛出NullPointerException。

  1. Objects.equal("a", "a"); //true
  2. Objects.equal(null, "a"); //false
  3. Objects.equal("a", null); //false
  4. Objects.equal(null, null); //true

注意:JDK7新增Objects类提供了功能类似的Objects.equals()方法

hashCode

更简单的对所有属性进行hash计算。Guava的Objects.hashCode(Object...)根据属性顺序创建一个顺序敏感的hash计算。使用Objects.hashCode(f1,f2,...fn)来替代手工构建。

注意:JDK7新增的Objects类提供了功能类似的Objects.hash(Object...)方法。

toString

在调试阶段一个好的toString()是非常有用的,但是写起来是非常痛苦的。使用Objects.toStringHelper()可以很简单的创建一个有用的toString(),简单示例如下:

  1. // 返回"ClassName{x=1}"
  2. Objects.toStringHelper(this).add("x", 1).toString();
  3. //返回"MyObject{x=1}"
  4. Objects.toStringHelper("MyObject").add("x", 1).toString();

compare/compareTo

直接实现Comparator或Comparable是痛苦的,考虑下面的实现:

  1. class Person implements Comparable<Person> {
  2. private String lastName;
  3. private String firstName;
  4. private int zipCode;
  5. public int compareTo(Person other) {
  6. int cmp = lastName.compareTo(other.lastName);
  7. if (cmp != 0) {
  8. return cmp;
  9. }
  10. cmp = firstName.compareTo(other.firstName);
  11. if (cmp != 0) {
  12. return cmp;
  13. }
  14. return Integer.compare(zipCode, other.zipCode);
  15. }
  16. }

这段代码非常混乱,很难找出问题,而且非常冗余,我们应该可以做到更好。

因此,Guava提供了ComparisonChain

ComparisonChain是惰性比较:它仅在找到非零值的时候才进行比较,完成后忽略后面的输入。

  1. public int compareTo(Foo that) {
  2. return ComparisonChain.start()
  3. .compare(this.aString, that.aString)
  4. .compare(this.anInt, that.anInt)
  5. .compare(this.anEnum, that.anEnum, Ordering.nature().nullsFirst())
  6. .result();
  7. }

这样流式的方式具有更好的可读性,不会导致意外的错误,除了必须的不会做任何额外的工作,足够精简。其他关于Comparison的工具类可以在”Guava的流式比较器——Ordering.md)”中找到。