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