Они не взаимозаменяемы. Хороший пример - Comparable
против Comparator
в JDK.
В вашем случае Comparable
представляет собой реализацию интерфейса. Comparator
является примером шаблона стратегии. С двумя подписями Collections.sort
вы можете сделать это
Collections.sort(listOfComparables);
или
Collections.sort(anyList, comparator);
Представьте, что у вас есть список Car
с. Возможно, вы захотите отсортировать список по цвету, по количеству мест, по лошадиным силам. В этом случае нет смысла внедрять Comparable
. Автомобили не имеют естественного заказа; нет смысла отдавать предпочтение одному упорядочиванию над другим путем реализации интерфейса. В этом случае все заказы создаются равными. Если бы вы объявили автомобиль как Comparable
, он, скорее всего, не был бы интуитивно понятным для пользователей вашего класса. Возможно, им придется проверить реализацию или документацию, чтобы выяснить, какой порядок вы намеревались. Вы должны отсортировать их, используя Comparator
s.
Теперь представьте, что у вас есть список Coin
s. Монеты имеют довольно очевидный естественный порядок: их номинал. Вы могли бы сортировать свои монеты по размеру или весу, но их основной причиной существования является представление разных номиналов. В этом случае не все заказы созданы равными. Здесь имеет смысл реализовать Comparable
, и, если требуются другие упорядочения, вы можете использовать для этого Comparator
s.
В более общем смысле шаблон стратегии часто лучше всего применять при наличии никто не "предпочитал" подход. Класс может реализовать интерфейс только один раз, но он может использовать множество различных стратегий. Это своего рода инверсия управления .