Недавно я видел дискуссию в 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
, это вызвало бы ошибку компиляции, заставив вас реализовать "правильное" поведение (или, по крайней мере, вы знаете, что вы делаете).
Много семантики теряется с этим типом возвращаемого значения (и потенциально может вызвать некоторые трудные ошибки), поэтому зачем его создавать так?