Objects源码解读

1.equal()方法

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

1  Objects.equal("a", "a"); // returns true
2  Objects.equal(null, "a"); // returns false
3  Objects.equal("a", null); // returns false
4  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)来代替手动计算散列值。

 1  public static int hashCode(@Nullable Object... objects) {
 2         return Arrays.hashCode(objects);
 3     }
 4 
 5  public static int hashCode(Object a[]) {
 6         if (a == null)
 7             return 0;
 8 
 9         int result = 1;
10 
11         for (Object element : a)
12             result = 31 * result + (element == null ? 0 : element.hashCode());
13 
14         return result;
15     }

3.toString()方法

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

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

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

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

 1 public String toString() {
 2             boolean omitNullValuesSnapshot = this.omitNullValues;
 3             String nextSeparator = "";
 4             StringBuilder builder = (new StringBuilder(32)).append(this.className).append('{');
 5 
 6             for(Objects.ToStringHelper.ValueHolder valueHolder = this.holderHead.next; valueHolder != null; valueHolder = valueHolder.next) {
 7                 if (!omitNullValuesSnapshot || valueHolder.value != null) {
 8                     builder.append(nextSeparator);
 9                     nextSeparator = ", ";
10                     if (valueHolder.name != null) {
11                         builder.append(valueHolder.name).append('=');
12                     }
13 
14                     builder.append(valueHolder.value);
15                 }
16             }
17 
18  private static final class ValueHolder {
19             String name;
20             Object value;
21             Objects.ToStringHelper.ValueHolder next;
22 
23             private ValueHolder() {
24             }
25         }

4.继承Comparable接口

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

1 @Override
2     public int compareTo(Account o) {
3         return ComparisonChain.start()
4                 .compare(this.accountName, o.accountName)
5                 .compare(this.money, o.money).result();
6     }

 

posted @ 2020-04-23 11:28  seedss  阅读(349)  评论(0编辑  收藏  举报