Objects源码解读

Bloddy 2020-04-23

1.equal()方法

Objects.equal方法可以避免jdk的equal()方法的对象为null时抛出空指针。

Objects.equal("a", "a"); // returns true
 Objects.equal(null, "a"); // returns false
 Objects.equal("a", null); // returns false
 Objects.equal(null, null); // returns true

其中的源码实现为:

1  public static boolean equal(@Nullable Object a, @Nullable Object b) {
2         return a == b || a != null && a.equals(b);
3     }

2.hash()算法

用对象的所有字段作散列[hash]运算,Guava的Objects.hashCode(Object...)会对传入的字段序列计算出合理的、顺序敏感的散列值。你可以使用Objects.hashCode(field1, field2, …, fieldn)来代替手动计算散列值。

public static int hashCode(@Nullable Object... objects) {
        return Arrays.hashCode(objects);
    }

 public static int hashCode(Object a[]) {
        if (a == null)
            return 0;

        int result = 1;

        for (Object element : a)
            result = 31 * result + (element == null ? 0 : element.hashCode());

        return result;
    }

3.toString()方法

好的toString方法在调试时是无价之宝,但是编写toString方法有时候却很痛苦。使用 Objects.toStringHelper可以轻松编写有用的toString方法。例如:

Objects.toStringHelper(this).add("x"1).toString();

Objects.toStringHelper("MyObject").add("x"1).toString();

注:底层使用一个单向链表来添加元素。

public String toString() {
            boolean omitNullValuesSnapshot = this.omitNullValues;
            String nextSeparator = "";
            StringBuilder builder = (new StringBuilder(32)).append(this.className).append(‘{‘);

            for(Objects.ToStringHelper.ValueHolder valueHolder = this.holderHead.next; valueHolder != null; valueHolder = valueHolder.next) {
                if (!omitNullValuesSnapshot || valueHolder.value != null) {
                    builder.append(nextSeparator);
                    nextSeparator = ", ";
                    if (valueHolder.name != null) {
                        builder.append(valueHolder.name).append(‘=‘);
                    }

                    builder.append(valueHolder.value);
                }
            }

 private static final class ValueHolder {
            String name;
            Object value;
            Objects.ToStringHelper.ValueHolder next;

            private ValueHolder() {
            }
        }

4.继承Comparable接口

Guava提供了ComparisonChain执行一种懒比较:它执行比较操作直至发现非零的结果,将返回计算结果,在那之后的比较输入将被忽略。

@Override
    public int compareTo(Account o) {
        return ComparisonChain.start()
                .compare(this.accountName, o.accountName)
                .compare(this.money, o.money).result();
    }

相关推荐