Когда в Java следует использовать интерфейс Comparable?

«Когда в Java следует использовать интерфейс Comparable?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс Comparable<T> следует реализовывать в классе, когда для его объектов существует естественный (логический) порядок сортировки по умолчанию.

Когда использовать:

  • Класс имеет одно очевидное и наиболее часто используемое правило сравнения (например, Integer — по числовому значению, String — лексикографически).
  • Вы хотите, чтобы методы сортировки (например, Collections.sort(list)) работали с вашими объектами "из коробки" без передачи дополнительного Comparator.
  • Вы планируете хранить объекты в коллекциях, которые автоматически сортируются (TreeSet, TreeMap).

Пример реализации для сортировки по возрасту:

class Person implements Comparable<Person> {
    private String name;
    private int age;

    // Конструктор, геттеры, сеттеры...

    @Override
    public int compareTo(Person other) {
        // Сравниваем по полю age (естественный порядок для этого класса)
        return Integer.compare(this.age, other.age);
        // Предпочтительнее использовать Integer.compare() для избежания переполнения
    }
}

// Использование:
List<Person> people = new ArrayList<>();
// ... добавление людей
Collections.sort(people); // Сортировка использует compareTo

Важно: Метод compareTo должен быть согласован с equals (хотя это не строгое требование компилятора). Если нужны разные способы сортировки, используйте Comparator. Comparable определяет один основной порядок.