Object common methods
equals
如果object对象允许为null,那么在实现Object.equals的时候因为你必须单独的检查为null的情况而变得复杂。由于Objects.equal以对null敏感的方式实现,可以让你不用再担心NullPointerException异常。
Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true
Note: JDK 7中新引入的对象类提供了等效的 Objects.equals方法
hashCode
Object 的哈希应该是更加简易的。Guava's Objects.hashCode(Object...) 为指定序列创建一个敏感并且有序的哈希。使用Objects.hashCode(field1, field2, ..., fieldn) 代替手动建立哈希。
Note: JDK 7中新引入的对象类提供了等效的 Objects.hash(Object...).方法
toString
在调试的时候,如果有一个好的toString 方法能够事半功倍,但是这样的toString 方法很难完美实现。使用 MoreObjects.toStringHelper() 能够轻松的创建出这样的toString方法. 下面是一个简单的例子:
// 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 接口,是非常不好的选择,思考下面的方法:
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);
}
}
这段代码很容易搞乱,很难发现bug,而且极其冗长,我们应该能够做得更好。
Guava 提供了ComparisonChain.来解决这个问题。
ComparisonChain 更倾向于是一种“懒”比较: 它只执行比较,直到找到非零结果,然后忽略进一步的输入。
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's 的"fluent Comparator" 排序解释请点击 here。