Java-compareTo и операторы
если у меня есть класс Person
что реализует Comparable
(сравнивает personA.height
до personB.height
, например), можно ли использовать
personA < personB
заменить на
personA.compareTo(personB) == -1?
есть ли какие-либо проблемы при этом или мне нужно перегрузить операторов?
6 ответов
в Java нет перегрузки оператора. Вы, вероятно, пришли из фона C++.
вы должны использовать compareTo
метод.
нет, это невозможно использовать personA < personB
в качестве замены. И вы не можете перегрузка операторов в Java.
кроме того, я бы рекомендовал изменить
personA.compareTo(personB) == -1
to
personA.compareTo(personB) < 0
что у вас сейчас, вероятно, работает для своего класса. Тем не менее, контракт на compareTo()
это то, что он возвращает отрицательное значение, когда personA
меньше personB
. Что отрицательное значение не должно быть -1, и ваш код может сломаться, если используется другой класс. Он также может сломаться, если кто-то изменит compareTo()
метод к другой -- но все еще уступчивой -- реализации.
- Это невозможно, нет, и Java не поддерживает перегрузку операторов (кроме встроенных перегрузов).
кстати, вместо того, чтобы писать == -1
, вы должны написать < 0
. compareTo
просто требуется, чтобы вернуть отрицательное / нулевое / положительное значение, а не конкретно -1/0/1 - ...
нет, "
personA.compareTo(personB)==-1
документы API просто говорят, что compareTo() возвращает отрицательное целое число, когда объект меньше указанного объекта, что не обязательно будет -1. Использовать
personA.compareTo(personB) < 0
вместо.
это не возможно, java не дает вам перегрузку оператора.
Но более OO вариант, чтобы добавить метод внутри человека
public boolean isTallerThan(Person anotherPerson){
return this.compareTo(anotherPerson) > 0;
}
вместо того, чтобы писать
if(personA.compareTo(personB) > 0){
}
можно писать
if(personA.isTallerThan(personB)){
}
IMHO это более читабельно, потому что он скрывает детали и выражается на языке домена, а не специфику java.
Java не имеет перегрузки оператора1, так что да, есть проблема: это невозможно.
1 есть, конечно, несколько встроенных перегрузок:+
оператор работает на интегральных типах, типах с плавающей запятой и на String
s. Но вы не можете определить свой собственный.