4

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

4

4 回答 4

8

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

但是,如果您的代码正确性取决于排序,那么我认为依赖toString.

于 2013-08-25T07:44:57.210 回答
3

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

于 2013-08-29T13:33:44.317 回答
1

如果您的程序曾经toString()使用自然排序来进行词法排序,以至于程序执行依赖于它,那么覆盖toString()扩展类的默认值是明智的。在这种情况下,您应该使该toString()方法成为最终方法,并清楚地记录它用于订购。

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

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

于 2013-08-25T13:15:59.330 回答
0

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

于 2013-08-27T10:28:42.127 回答