2 Как сравнить метод в том же определении класса, как я могу заставить использовать второй? - PullRequest
2 голосов
/ 22 декабря 2010

Я хочу отсортировать список List<Blabla> donnees по критерию на одном из его полей.Моя проблема в том, что CompareTo уже переопределено для этого класса.Итак, у меня есть что-то вроде:

Blabla {

    public int compareTo(Object other) {
        ...
     }

    public int compareTo(Blabla other) {
        ... 
     }

}

В классе бизнес-уровня я вызываю:

Business {
   method (){
       Collections.sort(List<Blabla > donnees);
   }

}

Но этот вызов N ° 1 сравнивает метод с параметром объекта.Как я могу отсортировать мой список методом N ° 2?

Это на старом и огромном приложении, я не знаю побочных эффектов при изменении чего-либо в методе N ° 1compareTo, поэтому я хочудобавьте другой метод compareTo (или что-нибудь еще) вместо изменения первого.

Ответы [ 3 ]

4 голосов
/ 22 декабря 2010

использовать Comparator вместо Comparable .

Это позволит вам использовать столько разных способов, сколько вы хотите сравнить

0 голосов
/ 22 декабря 2010

Я полагаю, что ответ на вопрос о том, почему вы в конечном итоге вызываете метод compareTo(Object) вместо конкретного, заключается в том, что в вашем определении класса указано implements Comparable (без какого-либо параметра типа).Без какого-либо универсального типа любые типы, такие как T, по умолчанию будут Object.

. Есть несколько решений для этого.Первый уже был рекомендован другими, и он включает в себя создание собственных пользовательских Comparator<Blabla> объектов и использование их в ваших методах сортировки.Поскольку эти компараторы являются отдельными объектами, они не будут мешать существующему поведению класса.Возьмите эти компараторы, например, для некоторого класса Person, который имеет методы getName() и getAge().Вы можете создать столько их, сколько вам нужно.

public class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
}

public class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

После того, как вы все заработаете, вы можете решить, хотите ли вы изменить свой исходный класс, чтобы он правильно реализовывал Comparable<Blabla>.В этот момент вы полностью удаляете метод compareTo(Object) и оставляете другой.Когда вы компилируете или сохраняете в своей IDE, вы обнаруживаете все места, на которые этот объект ссылается как Comparable без типа, и они будут отображаться как предупреждения или ошибки компилятора.Затем вам решать, как исправить код в каждом случае.Это очень сильно зависит от того, что метод compareTo(Object) делает иначе, чем метод compareTo(Blabla).Если он явно выполняет instanceof проверку и / или приведение непосредственно к типу Blabla, то преобразование должно быть на 100% безопасным, поскольку это означает, что весь существующий код должен использовать его правильно, если вы никогда не испытываете ClassCastException s во время выполнения.

0 голосов
/ 22 декабря 2010

в CompareTo (Object other) имеет оператор if, говорящий

`if(other instanceof Blabla) Return compareTo((Blabla)other)`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...