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 }