这个问题是在阅读 Joshua Bloch 的《Effective Java》后提示的。特别是在 Item #10 中,他认为解析对象的字符串表示并将其用于除更友好的打印输出/调试之外的任何事情都是不好的做法。原因是这样的使用“容易出错,如果你改变格式会导致脆弱的系统崩溃”。在我看来,番石榴Ordering.usingToString()
就是一个例子。那么使用它是不好的做法吗?
4 回答
好吧,如果排序仅用于决定以何种顺序向用户显示内容,我认为这是“更友好的打印输出/调试”的一部分。
但是,如果您的代码正确性取决于排序,那么我认为依赖toString
.
作为该方法的作者,我同意:它实际上只是一个拐杖。对于那些“看,我只需要一个Ordering<Object>
,该死的”案例。它可能应该被删除,因为Ordering.onResultOf(Functions.toStringFunction)
无论如何你都可以得到它的行为。
如果您的程序曾经toString()
使用自然排序来进行词法排序,以至于程序执行依赖于它,那么覆盖toString()
扩展类的默认值是明智的。在这种情况下,您应该使该toString()
方法成为最终方法,并清楚地记录它用于订购。
String
然而,创建另一个返回 a 的方法并根据该结果创建一个排序会更好,可能通过创建一个特定Comparator
的来进行排序。例如,参见name()
Java 中用于枚举的 final 方法。一般来说,它会创建相同的字符串,toString()
但即使toString()
已被覆盖,仍然可以使用它执行排序。
如果您使用最后一种方法,那么Ordering.usingToString()
当然不会有太大用处。
在某些明显的情况下,它实际上像 StringBuffer 等一样有意义。显然,对于大多数“业务”类来说,依赖 toString() 是没有意义的。