簡體   English   中英

在一個類中同時實現可比較和比較器接口:優點和缺點

[英]Implementing both comparable and comparator interface in a single class : Pros and Cons

這是我遇到的一個非常獨特的問題(也許有人必須回答)。 有人問我可以在一個類中同時實現可比較和比較器接口嗎? 我有一點暗示,這有可能。 由於我以前從未嘗試過這種方法……我自己檢查了該方法,因此發布了這個問題,以便其他人可以在這里快速找到它。

從技術上講,您可以執行此操作,但這將是不正確的做法。 當類實現Comparable ,意味着該類具有自然順序。 例如,諸如Integer類的值類實現Comparable ,因此您只需將它們的列表傳遞給Collections.sort獲得預期的結果。

另一方面,當您需要為其他類創建一些自定義排序時, Comparator基本上被設計為用作匿名類。 或者為沒有自然順序的類提供順序。

可能存在這樣的情況,即班級除了其自然順序外,還應該具有其他順序。 處理此類情況的最佳方法是在此類中創建static常量比較器。 例如,如果您的Person類具有nameage ,則可以按名稱進行自然排序,並添加其他比較器,以按年齡對Persons進行排序。

     class Person implements Comparable<Person> {

        public static final Comparator<Person> BY_AGE_COMPARATOR = new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.age < o2.age ? -1 : (o1.age == o2.age ? 0 : 1);
            }
        };

        private int age;
        private String name;

        @Override
        public int compareTo(Person o) {
            return name.compareTo(o.name);
        }
    }

這種方法更好,因為您不需要類的實例來訪問其比較器。 您還可以根據需要向該類添加盡可能多的其他比較器。

總而言之,當類實現Comparator它通常意味着對某些實體進行排序是此類的主要目的。 實現Comparable意味着可以使用某些自然順序對此類的實例進行排序。 使類同時實現ComparableComparator意味着您具有自然的訂購順序 這沒有道理。

是的,我們可以擴展任何pojo類以實現可比較和比較器接口,並實現它們定義的方法。

我在Student POJO示例課中實現了它。 當調用Collections.sort(studentList) ...時使用compareTo()

當調用Collections.sort(studentList, new Student()) ... compare()時

好處:

1)我對比較器和比較器接口都有單類實現。

缺點:

1)我只能在一類中定義一個可比較的對象,並且只能定義一個比較器。

2)現在要定義任何新的比較器,我必須移至其他類或動態定義它(匿名類)。

3)但是比較器的動機已經喪失了。比較器提供了一個外部實現,用於比較類外部的類對象。 在內部定義它可能會引起混淆,即所謂的什么時候?

如果我錯過了任何其他活動,人們可以加分。

優點

  1. 如果大多數時候我們都有特定的排序方法可以使用,則可以使用Comparable接口的compareTo()方法。 例如,大多數時候需要使用name屬性對Employee對象進行排序,您將使用Comparable接口的compareTo()方法並使用雇員姓名對其進行排序。 雇員對象的用戶可以直接使用Collections.sort(empList)。

  2. 如果我們需要特定的排序順序,則可以使用比較器實現。 因此,在員工情況下,如果我們需要按地址排序,則可以有一個地址實現,並將其用作Collections.sort(empList,new Employee())的參數; 這里的employee對象將實現compare(Object emp,Object emp1)。

缺點

  1. 比較器實現應實現兩個對象之間的比較。 因此,我們必須將雇員對象作為比較器傳遞,這不是很直觀。

  2. 在設計方面,理想的比較器方法不屬於雇員類,因為它不使用任何正在調用它的雇員對象(此)的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM