前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Guava 指南 之「通用 Object 方法」

Guava 指南 之「通用 Object 方法」

作者头像
CG国斌
发布2018-01-08 17:52:30
6430
发布2018-01-08 17:52:30
举报
文章被收录于专栏:维C果糖维C果糖

通用 Object 方法

equals

当你的对象含有的多个字段可能为null的时候,实现Object.equals会很痛苦,因为你不得不分别对它们进行null检查。使用Objects.equal能够帮助你用一个对null敏感的方式执行equals检查,而不必冒着抛出NullPointerException的风险。例如:

代码语言:javascript
复制
Objects.equal("a", "a");    // returns true
Objects.equal(null, "a");   // returns false
Objects.equal("a", null);   // returns false
Objects.equal(null, null);  // returns true

注意:在 JDK 7 中提供了等效的Objects.equals方法。

hashCode

散列一个对象的所有字段应该更简单。Guava 的Objects.hashCode(Object...)会对指定的字段构建出一个合理的、顺序敏感的散列值。我们应该使用Objects.hashCode(field1, field2, ..., fieldn)来代替手工的构建散列值。

注意:在 JDK 7 中提供了等效的Objects.hash(Object...)方法。

toString

一个好的toString方法在调试时是无价之宝,不过编写toString方法却有些痛苦。使用MoreObjects.toStringHelper可以让你非常轻松的创建一个有用的toString方法。例如:

代码语言:javascript
复制
 // Returns "ClassName{x=1}"
   MoreObjects.toStringHelper(this)
       .add("x", 1)
       .toString();

   // Returns "MyObject{x=1}"
   MoreObjects.toStringHelper("MyObject")
       .add("x", 1)
       .toString();

compare/compareTo

直接实现Comparator或者Comparable接口也让人头痛。考虑下面这种情况:

代码语言:javascript
复制
class Person implements Comparable<Person> {
    private String lastName;
    private String firstName;
    private int zipCode;

    public int compareTo(Person other) {
        int cmp = lastName.compareTo(other.lastName);
        if (cmp != 0) {
            return cmp;
        }
        cmp = firstName.compareTo(other.firstName);
        if (cmp != 0) {
            return cmp;
        }
        return Integer.compare(zipCode, other.zipCode);
    }
}

这段代码冗长、混乱,而且不便调试。我们应该能够做的更好。为此,Guava 提供了ComparisonChainComparisonChain执行一种“懒惰”的比较策略:它执行比较操作直至发现非零的结果,在那之后的输入都将被忽略。例如:

代码语言:javascript
复制
public int compareTo(Foo that) {
    return ComparisonChain.start()
    .compare(this.aString, that.aString)
    .compare(this.anInt, that.anInt)
    .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
    .result();
}

这种流畅的风格更具可读性,发生错误的几率更小,并且足够聪明以避免不必要的工作。在 Guava 的“流畅比较器”类Ordering中,我们能够看到更多的比较器工具。

翻译声明:本文翻译自 GitHub,Google Guava - CommonObjectUtilitiesExplained.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通用 Object 方法
    • equals
      • hashCode
        • toString
          • compare/compareTo
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档