你应该避免使用Guavas Ordering.usingToString()吗?

时间:2013-08-25 07:26:32

标签: java guava effective-java

在阅读Joshua Bloch的“Effective Java”后,提出了这个问题。特别是在第10项中,他认为解析对象的字符串表示并将其用于除了友好的打印输出/调试之外的任何事情都是不好的做法。原因是这样的使用“容易出错,导致脆弱的系统在您更改格式时会中断”。 对我而言,看起来Guava的Ordering.usingToString()就是一个例子。那么使用它是不好的做法吗?

4 个答案:

答案 0 :(得分:8)

好吧,如果排序仅用于决定向用户显示内容的顺序,我认为它是“友好的打印输出/调试”的一部分。

但是,如果您的代码正确性取决于排序,那么我认为依赖toString确实是一个坏主意。

答案 1 :(得分:3)

作为该方法的作者,我同意:它只是一个拐杖。对于那些“看,我只需要一个Ordering<Object>,该死的”案例。它应该被删除,因为无论如何你都可以使用Ordering.onResultOf(Functions.toStringFunction)获得它的行为。

答案 2 :(得分:1)

如果你的程序使用toString()进行词法排序,使用自然排序,程序执行取决于它,那么覆盖默认{{1}是明智的扩展的类。在这种情况下,您应该使toString()方法最终并明确记录它是否用于订购。

然而,创建另一个返回toString()的方法并根据该结果创建排序会更好,可能通过创建特定的String来进行排序。例如,请参阅Java中用于枚举的最终方法name()。通常,它会创建与toString()相同的字符串,但即使已覆盖Comparator,仍可以使用它执行排序。

如果您使用最后一种方法,那么toString()当然不会有太大用处。

答案 3 :(得分:0)

有一些明显的情况,它实际上像StringBuffer等一样有意义。显然,大多数“业务”类依赖于toString()是没有意义的。