lixmet
lixmet
发布于 2周前

java.util.Objects的使用

java.utils.Objects针对Object对象提供了几个静态的工具方法,这些方法可以归类为:

  1. null安全检查
  2. 对象比较
  3. 计算对象hash code
  4. 对象转换为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"设置为空字符串。