【发布时间】:2009-11-05 18:56:00
【问题描述】:
我有几个Comparators - 一个用于Dates,一个用于小数,一个用于百分比,等等。
起初我的十进制比较器是这样的:
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);
}
}
生活变得更好了。测试感觉更可靠。然而,我的代码审查员指出,“nulls 呢?”
太好了,所以现在我必须使用 NullPointerException 重复上述操作,或者在方法主体前添加:
if (s1 == null) {
if (s2 == null) {
return 0;
} else {
return -1;
}
} else if (s2 == null) {
return 1;
}
这个方法很大。最糟糕的是,我需要用三个其他类重复这种模式,它们比较不同类型的字符串,并且在解析时可能引发三个其他异常。
我不是 Java 专家。有没有比 -- gasp -- 复制和粘贴更清洁、更整洁的解决方案?只要记录在案,我是否应该用正确性来换取不复杂性?
更新:有些人认为处理null 值不是Comparator 的工作。由于排序结果会显示给用户,我确实希望对空值进行一致的排序。
【问题讨论】:
-
我想知道为什么您需要比较器来处理所有可能的情况而不会出错。在我看来,您所做的似乎是错误屏蔽,这在大多数情况下都没有帮助。
-
如果我误解了代码,请原谅我,如果它们都无法解析,你是说 s1 和 s2 相等吗?这似乎有点奇怪......
-
关于错误屏蔽,这些类用于对 GWT 表中的列进行排序。从用户的角度来看,它需要“足够好”。关于相等性,是的,如果两个字符串都不可解析,则两个字符串都不可比较。因此,它们的不可解析性是相同的。
-
啊,所以所有具有不可解析值的行都将被组合在一起。明白了。
标签: java refactoring comparator