1. 程式人生 > >深入學習java原始碼之Objects.deepEquals()與Objects.nonNull()

深入學習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();
}