Недавно я видел дискуссию в SO-чате, но без каких-либо явных выводов, поэтому в итоге я спросил там.
Это по историческим причинам или согласованности с другими языками? При просмотре подписи compareTo различных языков он возвращает int.
Почему он не возвращает перечисление. Например, в С# мы могли бы сделать:
enum CompareResult {LessThan, Equals, GreaterThan};
и:
public CompareResult CompareTo(Employee other) {
if (this.Salary < other.Salary) {
return CompareResult.LessThan;
}
if (this.Salary == other.Salary){
return CompareResult.Equals;
}
return CompareResult.GreaterThan;
}
В Java после этой концепции были введены перечисления (я не помню о С#), но это могло быть разрешено дополнительным классом, таким как:
public final class CompareResult {
public static final CompareResult LESS_THAN = new Compare();
public static final CompareResult EQUALS = new Compare();
public static final CompareResult GREATER_THAN = new Compare();
private CompareResult() {}
}
и
interface Comparable<T> {
Compare compareTo(T obj);
}
Я спрашиваю об этом, потому что я не думаю, что int хорошо отражает семантику данных.
Например, в С#,
l.Sort(delegate(int x, int y)
{
return Math.Min(x, y);
});
и его близнец в Java 8,
l.sort(Integer::min);
компилируется как потому, что Min/min соблюдает контракты интерфейса компаратора (берут два ints и возвращают int).
Очевидно, что результаты в обоих случаях не ожидаются. Если тип возврата был Compare, это вызвало бы ошибку компиляции, заставив вас реализовать "правильное" поведение (или, по крайней мере, вы знаете, что вы делаете).
Много семантики теряется с этим типом возвращаемого значения (и потенциально может вызвать некоторые трудные ошибки), поэтому зачем его создавать так?