Тестовый код (просто для соответствия SSCCE, очевидно, есть гораздо лучшие способы раскачивать собственные модели данных без учета регистра)
public class TestClass implements java.lang.Comparable<TestClass> {
public String test;
@Override
public int compareTo(TestClass o) {
if (o == null) {
throw new NullPointerException();
}
return equals(o) ? 0 : test.toLowerCase().compareTo(o.test.toLowerCase());
}
@Override
public boolean equals(Object o) {
return (o == this) ? true : o instanceof TestClass ? test.equalsIgnoreCase(((TestClass) o).test) : false;
}
@Override
public int hashCode() {
return test.toLowerCase().hashCode();
}
}
Скажем, я хочу, чтобы мой класс, реализующий Comparable
, следовал «настоятельным рекомендациям» предложено в API:
Настоятельно рекомендуется, но не обязательно, чтобы (x.compareTo(y)==0) == (x.equals(y)).
Было бы нормально использовать equals()
внутри compareTo()
? Конечно, мы гарантируем, что equals()
не будет звонить compareTo()
в ответ.
Аналогично: когда что включать?
a? true: b? c: false
. Это запутанное выражение дляa || b && c
. То естьreturn o==this || o instanceof TestClass && test.equalsIgnoreCase(((TestClass) o).test)
сделает то же самое. - person Holger   schedule 06.09.2013