суббота, 30 марта 2013 г.

Comparable


Comparable - это интерфейс, который позволяет сравнить объекты с соотвествии с натуральным порядком.

Списки или массивы объектов классов, реализующих данный интерфейс могут быть отсортированны автоматически с помощью соответсвующих статических функций Collections.sort() и Arrays.sort().

Интерфейс Comparable объявляет один единственный метод, который служит для определения натурального порядка экземпляров класса:
public interface Comparable<T> {
    public int compareTo(T obj);
}

Этот метод сравнивает вызывающий объект с указанным в качестве входного параметра метода.

Метод compareTo() возвращает:
  • отрицательное значение -  если вызывающий объект имеет меньшее значение
  • 0 - если объекты равны
  • положительное значение - если вызывающий объект имеет большее значение
Натуральный порядок подразумевает выполнение следующего правила:
  • consistent with equals - если объекты равны по функции compareTo(), то они должны быть также равны и по функции equals(). Это должно быть справедливо для любых двух объектов класса. Стоит принять во внимание, что null не является экземпляром ни одного класса, поэтому:  
    • compareTo(null) - должна выбрасывать NullPointerException
    •  equals(null) - должна возвращать false

    Выполнение данного правила строго рекомендованно, хотя и не обязательно. Но в этом случаем не будет нарушен контракт для отсортированных наборов и карт, использующий естественное упорядочивание согласованное с равенством.
Ряд классов уже реализует интерфейс Comparable. В их число входят такие классы, как: Byte, Character, Double, Float, Long, Short, Integer, String, BigDecimal, BigInteger, Time, Date, File, URI и ряд других классов.

За исключением BigDecimal, все из перечисленных классов имеют натуральный порядок, который согласуются с равенством.

При попытке отсортировать список, набор  используя Collections.sort(), элементы которого не реализуют Comparable интерфейс, будет ошибка компиляции:
Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Person>). 
The inferred type Person is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>

При попытке отсортировать массив  используя Arrays.sort(), элементы которого не реализуют Comparable интерфейс, будет выброшено ClassCastException исключение.

Отличие в том, что коллекции являются типизированными, а в случае с массивами используеся Object[].



Комментариев нет:

Отправить комментарий