我有几个Comparator
s - 一个代表Date
s,一个代表小数,一个代表百分比,等等。
起初我的十进制比较器看起来像这样:
class NumericComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final Double i1 = Double.parseDouble(s1);
final Double i2 = Double.parseDouble(s2);
return i1.compareTo(i2);
}
}
生活很简单。当然,这不能处理字符串不可解析的情况。所以我改进了compare()
:
class NumericComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final Double i1;
final Double i2;
try {
i1 = Double.parseDouble(s1);
} catch (NumberFormatException e) {
try {
i2 = Double.parseDouble(s2);
} catch (NumberFormatException e2) {
return 0;
}
return -1;
}
try {
i2 = Double.parseDouble(s2);
} catch (NumberFormatException e) {
return 1;
}
return i1.compareTo(i2);
}
}
生活变得更好了。测试感觉更可靠。然而,我的代码审查员指出,“ null
s 呢?”
太好了,所以现在我必须重复上述NullPointerException
内容或在方法主体前添加:
if (s1 == null) {
if (s2 == null) {
return 0;
} else {
return -1;
}
} else if (s2 == null) {
return 1;
}
这个方法很大。最糟糕的是,我需要用其他三个比较不同类型的字符串的类重复这种模式,并且在解析时可能会引发其他三个异常。
我不是 Java 专家。有没有比复制和粘贴更清洁、更整洁的解决方案?只要记录在案,我是否应该以缺乏复杂性为代价换取正确性?
更新:有些人认为Comparator
处理null
值不是 ' 的工作。由于排序结果显示给用户,我确实希望对空值进行一致的排序。