深入学习java源码之Objects.deepEquals()与Objects.nonNull()

深入学习java源码之Objects.deepEquals()与Objects.nonNull()

该类由static用于对对象进行static实用方法组成。 这些实用程序包括用于计算对象的哈希码的null -safe或null方法,为对象返回一个字符串,并比较两个对象。 

方法

Modifier and Type Method and Description
static <T> int compare(T a, T b, Comparator<? super T> c)

返回0,如果参数都是相同的, c.compare(a, b)其他。

static boolean deepEquals(Object a, Object b)

返回 true如果参数是深层相等,彼此 false其他。

static boolean equals(Object a, Object b)

返回 true如果参数相等,彼此 false其他。

static int hash(Object... values)

为输入值序列生成哈希码。

static int hashCode(Object o)

返回非的哈希码 null参数,0为 null参数。

static boolean isNull(Object obj)

返回 true如果提供的引用是 null否则返回 false

static boolean nonNull(Object obj)

退货 true如果提供的参考是非 null否则返回 false

static <T> T requireNonNull(T obj)

检查指定的对象引用不是 null

static <T> T requireNonNull(T obj, String message)

检查指定的对象引用不是null并抛出自定义的NullPointerException如果是)。

static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)

检查指定的对象引用不是null并抛出一个自定义的NullPointerException如果是)。

static String toString(Object o)

返回非 null参数调用 toString"null"参数的 "null"null

static String toString(Object o, String nullDefault)

如果第一个参数不是 null ,则返回第一个参数调用 toString的结果, toString返回第二个参数。

java源码

package java.util;

import java.util.function.Supplier;

public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

    public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }

    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }

    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }

    public static String toString(Object o) {
        return String.valueOf(o);
    }

    public static String toString(Object o, String nullDefault) {
        return (o != null) ? o.toString() : nullDefault;
    }

    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return (a == b) ? 0 :  c.compare(a, b);
    }

    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }

    public static boolean isNull(Object obj) {
        return obj == null;
    }

    public static boolean nonNull(Object obj) {
        return obj != null;
    }

    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        if (obj == null)
            throw new NullPointerException(messageSupplier.get());
        return obj;
    }
}

抛出以表明断言失败。 
此类提供的七个单参数公共构造函数确保调用返回的断言错误: 

  new AssertionError(expression) 具有作为其详细消息表达的字符串的转换 (如在The Java™ Language Specification部15.18.1.1定义),而不管表达的类型。 
java源码

package java.lang;

public class AssertionError extends Error {
    private static final long serialVersionUID = -5013299493970297370L;

    public AssertionError() {
    }

    private AssertionError(String detailMessage) {
        super(detailMessage);
    }

    public AssertionError(Object detailMessage) {
        this(String.valueOf(detailMessage));
        if (detailMessage instanceof Throwable)
            initCause((Throwable) detailMessage);
    }

    public AssertionError(boolean detailMessage) {
        this(String.valueOf(detailMessage));
    }

    public AssertionError(char detailMessage) {
        this(String.valueOf(detailMessage));
    }

    public AssertionError(int detailMessage) {
        this(String.valueOf(detailMessage));
    }

    public AssertionError(long detailMessage) {
        this(String.valueOf(detailMessage));
    }

    public AssertionError(float detailMessage) {
        this(String.valueOf(detailMessage));
    }

    public AssertionError(double detailMessage) {
        this(String.valueOf(detailMessage));
    }

    public AssertionError(String message, Throwable cause) {
        super(message, cause);
    }
}

一个Error是的子类Throwable表示严重的问题,合理的应用程序不应该试图捕获。 大多数这样的错误是异常情况。 ThreadDeath错误虽然是“正常”的条件,但也是Error一个子类,因为大多数应用程序不应该试图抓住它。 
一个方法不需要在其throws子句中声明Error的Error ,该子类可能在执行方法期间抛出,但未被捕获,因为这些错误是不应该发生的异常条件。 也就是说, Error及其子类被视为未经检查的异常,用于编译时检查异常。 

package java.lang;

public class Error extends Throwable {
    static final long serialVersionUID = 4980196508277280342L;

    public Error() {
        super();
    }

    public Error(String message) {
        super(message);
    }

    public Error(String message, Throwable cause) {
        super(message, cause);
    }

    public Error(Throwable cause) {
        super(cause);
    }

    protected Error(String message, Throwable cause,
                    boolean enableSuppression,
                    boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

当应用程序尝试在需要对象的情况下使用null时抛出。 这些包括: 
调用一个null对象的实例方法。 
访问或修改null对象的字段。 
取null的长度,好像是一个数组。 
访问或修改的时隙null就好像它是一个数组。 
投掷null好像是一个Throwable价值。 
应用程序应该抛出此类的实例以指示null对象的其他非法使用。 NullPointerException对象可以由虚拟机构建,就像suppression were disabled and/or the stack trace was not writable一样 。 
 

package java.lang;

public
class NullPointerException extends RuntimeException {
    private static final long serialVersionUID = 5162710183389028792L;

    public NullPointerException() {
        super();
    }

    public NullPointerException(String s) {
        super(s);
    }
}

没有要求每次调用供应商时都会返回新的或不同的结果。 

这是一个functional interface的功能方法是get() 。 

Modifier and Type Method and Description
T get()

获得结果。

java源码

package java.util.function;

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/85543005