Assuming that a comparator or compareTo method always returns -1 or 1 if the first operand is less than or greater than the second is
incorrect.
The specifications for both methods, Comparator.compare and Comparable.compareTo, state that their return value is "a
negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object." Even if a specific
comparator always returns -1, 0, or 1, this is only an implementation detail, not the API contract developers can rely on.
Replace
== -1 with < 0 (the first operand is less than the second) == 1 with > 0 (the first operand is greater than the second) != -1 with >= 0 (the first operand is greater than or equal to the second) != 1 with <= 0 (the first operand is less than or equal to the second)
public class Main {
boolean isAGreaterThanB(Comparable<Integer> a, Integer b) {
return a.compareTo(b) == 1; // Noncompliant, check for constant return value
}
public static void main(String[] args) {
ByteComparator comparator = new ByteComparator();
if (comparator.compare((byte) 23, (byte) 42) == -1) { // Noncompliant, check for constant return value
System.out.println("23 < 42");
} else {
System.out.println("23 >= 42");
}
}
static class ByteComparator implements Comparator<Byte> {
@Override
public int compare(Byte a, Byte b) {
return a - b;
}
}
}
public class Main {
boolean isAGreaterThanB(Comparable<Integer> a, Integer b) {
return a.compareTo(b) > 0; // Compliant, check for positive return value
}
public static void main(String[] args) {
ByteComparator comparator = new ByteComparator();
if (comparator.compare((byte) 23, (byte) 42) < 0) { // Compliant, check for negative return value
System.out.println("23 < 42");
} else {
System.out.println("23 >= 42");
}
}
static class ByteComparator implements Comparator<Byte> {
@Override
public int compare(Byte a, Byte b) {
return a - b;
}
}
}