我有几个比较器 – 一个用于日期,一个用于小数,一个用于百分比等.
起初我的十进制比较器看起来像这样:
class NumericComparator implements Comparator {
@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 {
@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);
}
}
生活更美好.测试感觉更稳固.但是,我的代码审查员指出,“空值怎么样?”
好的,所以现在我必须用NullPointerException重复上面的内容,或者在方法体前加上:
if (s1 == null) {
if (s2 == null) {
return 0;
} else {
return -1;
}
} else if (s2 == null) {
return 1;
}
这种方法很庞大.最糟糕的是,我需要用其他三个类重复这个模式,这个类比较不同类型的字符串,并且在解析时可能引发其他三个异常.
我不是Java专家.有没有更清洁,更整洁的解决方案而不是 – 喘气 – 复制和粘贴?只要记录在案,我是否应该因缺乏复杂性而交换正确性?
更新:有人建议处理空值不是比较器的工作.由于排序结果显示给用户,我确实希望空值一致排序.