除了当然,它们与原语一起使用。我看到的大多数(如果不是全部)实现仅从程序员的角度来看是有用的。
编辑:我知道我应该覆盖默认行为,这就是我提到的实现:)。我确实得到了在GUI中需要字符串表示的一些组件中覆盖它的价值。但是,至少在JDK中,我看到很多的实现,只有在需要调试对象实例时才会使用。
为什么它以Object类为根,因为它只对GUI /调试东西有用?还有其他我不知道的用途吗?
答案 0 :(得分:17)
不,关键是您应该覆盖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<qualifier>String()
方法,比如.NET DateTime
类。 (ToShortDateString()
,ToLongDateString()
,ToLongTimeString()
,...)
编辑:至于为什么它根植于Object
类,只是因为ToString()
是任何的有效操作。
此外,字符串可以是数据类型或数据使用者之间编组的好方法,因为它(实际上)保证可以解析并且不需要额外的编码或关注。
答案 1 :(得分:13)
我个人的偏好是toString()应该从不用于调试以外的任何事情。如果要为对象生成字符串,请提供一个单独的方法,清楚地记录您的意图(getName(),getDescription()等)。永远不要依赖于toString()的实现。
问题在于,许多开发人员将toString()视为调试级别的字符串,并且不考虑更改它(例如添加或删除新字段时)。哎呀,一些自动化的toString()构建器使用反射从字段生成一个toString()。
我发现这种偏好多年来一直很好用。
答案 2 :(得分:12)
toString()就很有用。当然,这是出于调试目的,但也可以有效地将操作结果输出给用户。
例如,假设您有一个处理复数的Complex类。如果你想以 3 + 2i 的格式将它们打印给用户,如果它们定义toString()就很方便,因为你不必每次都写入格式,输出就是是一致的。如果您想要更改该表示形式,例如更改为 3 + 2j ,则只需触摸Complex类中的toString()方法。
因此toString()也不用于调试目的,但是获得对象的一致字符串表示的好方法。
答案 3 :(得分:6)
我可以说的是,当我更改了类的toString以显示一些额外的调试信息时,我遇到了代码中断。
有问题的代码是一个GUI库,它决定使用toString的值作为一些内部事物(几年前就是这样......我忘了它究竟是什么)。最终结果是我不再使用该库了。
我想说,因为很多人将toString视为用于调试(无论你认为它应该用于什么的意见),使用从它返回的值是有问题的做任何编程(如解析)或显示给用户。
如果你100%控制toString方法,那么一定要做你想要的。
所以,回答这个问题,没有toString不仅对调试很有用,你可以随心所欲地做任何事情。但是,如果toString以令你不快的方式改变,不要感到惊讶。
答案 4 :(得分:4)
根据我的经验,toString()在调试和日志记录之外几乎没有价值。你不能随着时间的推移依赖它的格式或内容,所以除了人类可读之外,不要依赖于除最简单的对象之外的任何东西(例如原始对象类型)。如果有多个数据成员,则期望它们可能随着时间的推移而改变类型或数量,以及toString()的输出随之改变。
我想强烈提出的另一点。不要在toString()中调用其他方法。没有什么比在调试器中检查断点上的变量内容更糟糕了,然后由于toString()中的方法调用而执行更多的代码。
答案 5 :(得分:3)
我认为重要的是指出那些回答提到“toString”的人注意到小写的“t”通常是在谈论Java,回答提到“ToString”的人通常都是指C#。当然,这不适用于所有回复。
在我自己的观察中(我每天都使用),鼓励C#中的程序员覆盖“ToString”以显示有用的文本表示。然而,在Java中,我几乎没有看到这一点。事实上,我很少看到这一点。
-jP
答案 6 :(得分:2)
首先,toString
方法应返回对象的人类可读文本表示。
此问题在Effective Java中显示为第10项:始终覆盖toString
。
它引用了Java API Specification方法的Object.toString
:
结果应该是简洁但是 信息表示即 方便一个人阅读。
除了调试之外,在将对象放入JList
或JTable
时,覆盖类的toString
方法非常有用,默认情况下会使用toString
在列表或表格中将对象显示为文本形式的方法。
例如,就我而言,我已经覆盖了添加到toString
的对象的JList
方法,以便用户能够通过列表查看有关该项目的信息GUI。
因此,确实有toString
方法对调试以外的情况有用的情况。关键是让toString
方法返回实际上对某人有用的信息,而不是默认的Object.toString
实现,其中对象的内存位置用于其文本表示。
答案 7 :(得分:1)
对
有用以及任何其他字符串输出。
答案 8 :(得分:0)
当将任何对象打印到字符串时,.NET Framework也会隐式调用ToString()。
Console.WriteLine("My Object is" + object.ToString());
相当于
Console.WriteLine("My Object is" + object);
因为隐式调用了ToString()。
我相信,虽然不确定,调试器使用它来获取对象的“值”。这可能相当方便,但有限。在大多数情况下,编写自己的调试器可视化器会更好。
答案 9 :(得分:0)
在AS3上,我不得不将2D数组转换为1D数组。最快(运行速度)和最简单(编码时间)的解决方案是:
var new1DArray:Array = the2DArray.toString().split(",");
感到惊讶,但它实际上正在按预期工作,也非常快!
答案 10 :(得分:0)
我使用ToString()获取日期时间格式。
答案 11 :(得分:0)
除了其他人已经说过的内容之外,在使用调用它的控件时,重写ToString()也很有用。例如,ComboBox:
myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.
答案 12 :(得分:-1)
它可能不是“预期”用途,但我已将其用于数据序列化
storeToHardDrive(studentList.ToString());