java.util.Objects的使用
java.utils.Objects针对Object对象提供了几个静态的工具方法,这些方法可以归类为:
- null安全检查
- 对象比较
- 计算对象hash code
- 对象转换为String
null安全检查
null安全检查有5个方法:
- isNull(Object obj):检查对象是否为null,null返回true,否则返回false
- nonNull(Object obj):与isNull相反,检查对象是否为非null,非null返回true,否则返回false
- requreNonNull:其他三个方法为参数不同requreNonNull,这三个方法要求对象为非null,否则抛出NullPointException。
示例
public User(final String newLastName, final String newFirstName){
this.lastName = Objects.requireNonNull(newLastName, "Last name cannot be null.");
this.firstName = Objects.requireNonNull(newFirstName, "First name cannot be null.");
}
对象比较
对象比较有三个方法:
- compare(T a, T b, Comparator<? super T> c):返回int,等同于使用c.compare(a, b)比较
- equals(Object a, Object b):对象相等笔记。a和b同为null,返回true,否则调用对象的equals方法作比较。
- deepEquals(Object a, Object b):和equals不同的地方是,如果比较的对象为数组,它会调用Arrays.equals0方法比较数组内的元素。
使用Objects.equals方法可以简化我们自己写的equals方法。
原来实现对象的equals方法:
public class Bar {
private Foo foo1;
private Foo foo2;
@Override
public boolean equals(Object obj){
if (obj == this) {
return true;
}
if (obj instanceof Bar) {
Bar other = (Bar) obj;
if (foo1 != other.foo1) {
if (foo1 == null || !foo1.equals(other.foo1)) {
return false;
}
}
if (foo2 != other.foo2) {
if (foo2 == null || !foo1.equals(other.foo2)) {
return false;
}
}
return true;
}
return false;
}
}
我们需要写类似的代码比较对象内的成员变量。
使用Objects.equals
public class Bar {
private Foo foo1;
private Foo foo2;
@Override
public boolean equals(Object obj){
if (obj == this) {
return true;
}
if (obj instanceof Bar) {
Bar other = (Bar) obj;
return Objects.equals(foo1, other.foo1) && Objects.equals(foo2, other.foo2)
}
return false;
}
}
对成员变量的比较可以简化为一行代码。
计算对象的hash code
计算对象的hash code有两个方法:
- hashCode(Object o):对象为null,返回0,否则返回对象的hashCode
- hash(Object... values):对多个输入的对象计算hash
hash方法也起到简化代码,增强代码可读性的作用。
原来实现hashCode方法:
public class Bar {
private Foo foo1;
private Foo foo2;
@Override
public int hashCode(){
int result = 17;
result = 31 * result + (foo1 == null ? 0 : foo1.hashCode());
result = 31 * result + (foo2 == null ? 0 : foo2.hashCode());
return result;
}
}
使用Objects.hash
public class Bar {
private Foo foo1;
private Foo foo2;
@Override
public int hashCode(){
return Objects.hash(foo1,foo2);
}
}
可以看到,只需要一行代码便可以计算出对象的hashCode,并且大大增强了代码的可读性。
对象转换为String
转换对象为String有两个方法:
- toString(Object o):如果对象为非null,返回对象的toString内容,否则返回“null”字符串
- toString(Object o, String nullDefault):和第一个方法的区别在于,nullDefault可以让我们设置null对象的默认显示。如何一些前端做接口时,可能需要把"null"设置为空字符串。