com.google.common.base.Objects
CommonObjectUtilitiesExplained
cgdecker编辑了这个页面 <relative-time datetime="2017-11-13T18:41:48Z" title="2017年11月14日GMT + 8上午2:41" style="box-sizing: border-box;">on 14 Nov 2017</relative-time> · 6次修订
对象常用方法
等于
当你的对象字段可以null
,实现Object.equals
可能会很痛苦,因为你必须单独检查null
。使用Objects.equal
允许您equals
以null敏感的方式执行检查,而不会冒险 NullPointerException
。
对象。相等(“ a ”,“ a ”); //返回true
对象。等于(null,“ a ”); //返回false
对象。等于(“ a ”,null); //返回false
对象。equal(null,null); //返回true
注意:Objects
JDK 7中新引入的类提供了等效 Objects.equals
方法。
的hashCode
哈希的所有字段都Object
应该更简单。Guava Objects.hashCode(Object...)
为指定的字段序列创建了一个合理的,对顺序敏感的哈希。使用Objects.hashCode(field1, field2, ..., fieldn)
而不是手动构建哈希。
注意:Objects
JDK 7中新引入的类提供了等效的 Objects.hash(Object...)
。
一个好的toString
方法在调试中是非常有价值的,但写起来很痛苦。使用MoreObjects.toStringHelper()
轻松创建一个有用的toString
。一些简单的例子包括:
//返回“ClassName {x = 1}”
MoreObjects 。toStringHelper( this)
.add(“ x ”,1)
的ToString();
//返回“MyObject {x = 1}”
MoreObjects 。toStringHelper( “ MyObject ”)
.add(“ x ”,1)
的ToString();
比较/的compareTo
直接实现Comparator
或实现Comparable
接口可能很痛苦。考虑:
class Person 实现 Comparable < Person > {
private String lastName;
private String firstName;
private int zipCode;
public int compareTo(Person other){
int cmp = lastName 。的compareTo(其他。 lastName的);
if(cmp != 0){
return cmp;
}
cmp = firstName 。的compareTo(其他。的firstName);
if(cmp != 0){
return cmp;
}
返回 整数。比较(邮政编码,其他。邮政编码);
}
}
这段代码很容易搞砸,很难扫描错误,而且令人不快的冗长。我们应该能够做得更好。
为此,番石榴提供ComparisonChain
。
ComparisonChain
执行“懒惰”比较:它只执行比较,直到找到非零结果,之后它忽略进一步的输入。
public int compareTo(Foo that){
return ComparisonChain 。开始()
.compare(此。 ASTRING,即。 ASTRING)
.compare(此。 ANINT,即。 ANINT)
.compare(此。 anEnum,即。 anEnum,订货。自然() 。 nullsLast())
。结果();
}
equals() 比较两个对象是否相等
hashCode() 计算hash值
实际使用
@Data
public class SysUser implements Comparable<SysUser> {
private Integer userId;
private Integer role;
private String loginName;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SysUser sysUser = (SysUser) o;
return Objects.equal(userId, sysUser.userId) &&
Objects.equal(role, sysUser.role) &&
Objects.equal(loginName, sysUser.loginName);
}
@Override
public int hashCode() {
return Objects.hashCode(userId, role, loginName);
}
//当前小于后面 -1,小于 1 ,相等 = 0
@Override
public int compareTo(SysUser o) {
return ComparisonChain.start()
.compare(this.role,o.role)
.compare(this.loginName,o.loginName)
.compare(this.userId,o.userId)
.result();
}
}
public class Test {
public static void main(String[] args) {
List<String> list = Lists.newArrayList();
list.add("peida");
list.add("jerry");
list.add("harry");
list.add("eva");
list.add("jhon");
list.add("neron");
List<String> list2 = Lists.newArrayList();
list.add("peida");
list.add("jerry");
list.add("harry");
list.add("eva");
list.add("jhon");
list.add("neron");
SysUser sysUser = new SysUser();
sysUser.setUserId(1);
sysUser.setRole(1);
sysUser.setLoginName("aa");
SysUser sysUser2 = new SysUser();
sysUser2.setUserId(1);
sysUser2.setRole(2);
sysUser2.setLoginName("aa");
System.out.println(Objects.equal(sysUser,sysUser2));
System.out.println(MoreObjects.toStringHelper(sysUser).add("age",10).addValue(1).addValue(2).addValue("ss"));
System.out.println(sysUser.compareTo(sysUser2));
System.out.println(sysUser2.compareTo(sysUser));
}
}
打印结果
false
SysUser{age=10, 1, 2, ss}
-1
1
网友评论