Использование ^
в качестве логического оператора XOR весьма необычно.Это работает, но я бы избежал этого для удобства чтения.!=
- хорошая замена.
return !((val1 != null) != (val2 != null)) && !(val2 != null && val1.compareTo(val2) != 0);
Теперь вы можете заменить двойное отрицание на ==
.Хорошо.
return ((val1 != null) == (val2 != null)) && !(val2 != null && val1.compareTo(val2) != 0);
Вы также можете распределить оставшиеся !
через законы де Моргана :
return ((val1 != null) == (val2 != null)) && (val2 == null || val1.compareTo(val2) == 0);
Это лучше, но, если честно, я все еще нахожуэто громоздко.Я бы пошел с чем-то более простым, даже если это не однострочный оператор:
if (val1 == null) {
return val2 == null;
}
else {
return val2 != null && val1.compareTo(val2) == 0;
}
Вы можете использовать троичный оператор вместо if
/ else
.По вашему личному предпочтению, которое вы найдете более читабельным:
return val1 == null
? val2 == null
: val2 != null && val1.compareTo(val2) == 0;
Вы упоминаете, что вам нужно использовать compareTo()
.Для тех, кто мог бы прочитать этот ответ, если бы вам не приходилось использовать compareTo()
, я бы использовал equals()
.
if (val1 == null) {
return val2 == null;
}
else {
return val1.equals(val2);
}
Тогда, как это происходит, вам даже не понадобитсянаписать этот метод вообще.Встроенный метод Objects.equals()
делает именно это: он возвращает true, если два объекта равны или оба они равны нулю.