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(); }