亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Java中怎么比較兩個對象

發布時間:2021-11-24 17:47:04 來源:億速云 閱讀:319 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“在Java中怎么比較兩個對象”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“在Java中怎么比較兩個對象”這篇文章吧。

Common Lang 中的 Builder 包內提供了一個 DiffBuilder 類,可以比較兩個對象,并返回不同的部分。

  1. 首先在要比較對象的類中實現 Diffable 接口,然后實現 DiffResult diff(T obj)  方法。

  2. 在DiffResult diff(T obj)  方法中,新建一個 DiffBuilder 對象,把需要比較的類屬性一一放入 DiffBuilder 中。

DiffBuilder 的構造函數有三個入參,lhs 是當前對象,rhs 是要比較的對象,style 是比較結果輸出的格式。

DiffBuilder(final T lhs, final T rhs,
        final ToStringStyle style)

假設有一個 Person 類定義了三個屬性 name、age 和 smoker。以下是使用不同的 ToStringStyle 所對應的輸出內容。

ToStringStyle說明輸出
SHORT_PREFIX_STYLE簡短Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true]
DEFAULT_STYLE默認org.apache.commons.lang3.builder.Person@9f70c54[name=deniro,smoker=false] differs from org.apache.commons.lang3.builder.Person@234bef66[name=jack,smoker=true]。
MULTI_LINE_STYLE多行org.apache.commons.lang3.builder.Person@9f70c54[
name=deniro
smoker=false
] differs from org.apache.commons.lang3.builder.Person@234bef66[
name=jack
smoker=true
]
NO_FIELD_NAMES_STYLE不包含類屬性名org.apache.commons.lang3.builder.Person@9f70c54[deniro,false] differs from org.apache.commons.lang3.builder.Person@234bef66[jack,true]。
SIMPLE_STYLE簡潔deniro,false differs from jack,true。
NO_CLASS_NAME_STYLE不包含類名[name=deniro,smoker=false] differs from [name=jack,smoker=true]。
JSON_STYLEJSON{"name":"deniro","smoker":false} differs from {"name":"jack","smoker":true}。

感覺 NO_CLASS_NAME_STYLE 與 JSON_STYLE 看的更清楚。

完整示例:

public class Person implements Diffable<Person> {

    private static final Logger log = LoggerFactory.getLogger(Person.class);

    String name;
    int age;
    boolean smoker;

    public DiffResult diff(Person obj) {
        // No need for null check, as NullPointerException correct if obj is null
        return new DiffBuilder(this, obj, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("name", this.name, obj.name)
                .append("age", this.age, obj.age)
                .append("smoker", this.smoker, obj.smoker)
                .build();
    }

    public static void main(String[] args) {
        Person a = new Person();
        a.name = "deniro";
        a.age = 22;
        a.smoker = false;

        Person b = new Person();
        b.name = "jack";
        b.age = 22;
        b.smoker = true;

        DiffResult result = a.diff(b);
        log.info("result -> {}。", result);
    }
}

輸出:

result -> Person[name=deniro,smoker=false] differs from Person[name=jack,smoker=true]。

如果是個大類,那么需要很多個 append 方法把這個大類的屬性放到 DiffBuilder 中,不太方便。可以寫個程序生成 DiffBuilder 初始化代碼,或者嘗試用反射來優化這部分代碼。

反射擴展:

(1)獲取對象所屬類的Class方法。

Class c = Class.forName("包.類名稱");

(2)獲得該類的所有Filed(不包括父類)。

Field[] fields = c.getDeclaredFields();

(3)將所有屬性的訪問權限設為true。

因為JavaBean中所有的屬性訪問權限都是private,所以無法直接獲得所有屬性,因此我們必須獲得其訪問權限,通過下面的方法完成:

setAccessible(true);

(4)輸出對象屬性

f.getField(對象名稱);

(5)獲取字段名

fields[j].getName()

(6)獲取字段值

fields[j].get(obj)

以上是“在Java中怎么比較兩個對象”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

项城市| 武隆县| 巨野县| 新泰市| 扎囊县| 沙坪坝区| 新源县| 北流市| 义马市| 咸丰县| 霞浦县| 朝阳市| 嘉黎县| 建德市| 凤凰县| 禄劝| 嵊州市| 通渭县| 南乐县| 玉溪市| 铜陵市| 玉门市| 博野县| 临沭县| 汤阴县| 巴青县| 仲巴县| 个旧市| 双柏县| 娄底市| 襄樊市| 宁德市| 泰和县| 济宁市| 武隆县| 长乐市| 垣曲县| 南充市| 砀山县| 白朗县| 启东市|