当然,它们与原语一起使用.我看到的大多数(如果不是全部)实现仅从程序员的角度来看是有用的.
编辑:我明白我应该覆盖默认行为,这就是为什么我提到实现:).我确实得到了在GUI中需要字符串表示的一些组件中覆盖它的价值.但是,至少在JDK中,我看到许多只在需要调试对象实例时才会使用的实现.
为什么它以Object类为根,因为它只对GUI /调试东西有用?还有其他我不知道的用途吗?
不,关键是您应该覆盖默认实现ToString()
以使其有用.ToString()
可以是将某些内容的值输出回UI的好方法.
一个简单的例子就是如果你有一个带有三个字符串的Name类(First,Middle,Last).您可以使用一种ToString()
方法为UI格式化它:例如,"Last,First Middle".
或者存储数学运算的类(值Left = 2,Right = 3,Result = 6,运算符enum = Multiply).打电话ToString()
给"2*3 = 6".
但是,拥有各种不同的To
方法(如.NET DateTime
类)可能更为常见.(ToShortDateString()
,ToLongDateString()
,ToLongTimeString()
,...)
编辑:至于为什么它植根于Object
类,它只是因为ToString()
是一个有效的操作任何东西.
此外,字符串可以是在数据类型或数据使用者之间进行编组的好方法,因为它(实际上)保证可以解析并且不需要额外的编码或关注.
我个人的偏好是toString()永远不应该用于除调试之外的任何事情.如果要为对象生成字符串,请提供一个单独的方法,清楚地记录您的意图(getName(),getDescription()等).永远不要依赖于toString()的实现.
问题是许多开发人员将toString()视为调试级别的字符串,并且不考虑更改它(比如添加或删除新字段时).哎呀,一些自动化的toString()构建器使用反射从字段生成toString().
我发现这种偏好多年来一直很好用.
只要您想要对象的字符串表示,toString()就很有用.当然,这是出于调试目的,但也可以有效地将操作结果输出给用户.
例如,假设您有一个处理复数的Complex类.如果你想以3 + 2i这样的格式将它们打印给用户,如果它们定义toString()就很方便,因为你不必每次都写入格式并且输出是一致的.如果您想要更改该表示形式,例如更改为3 + 2j,则只需触摸Complex类中的toString()方法即可.
所以toString()也不是为了调试目的,而是获得对象的一致字符串表示的好方法.
我可以说的是,当我更改类的toString以显示一些额外的调试信息时,我已经有代码中断了.
有问题的代码是一个GUI库,它决定使用toString的值作为一些内部事物(几年前它......我忘记了它究竟是什么).最终结果是我不再使用该库了.
我会说,因为一大群人将toString视为用于调试(无论你认为它应该用于什么的意见),使用从它返回的值来做任何编程都是有问题的(比如解析它)或将其显示给用户.
如果您100%控制toString方法,那么无论如何都要做你想要的.
所以,回答这个问题,没有toString不仅对调试很有用,你可以随心所欲地做任何事情.但是,如果toString以令你不快乐的方式改变,不要感到惊讶.