toString()只对调试有用吗?

当然,除了它们与原语的使用。 我看到的大多数(如果不是全部)实现仅从程序员的角度来看是有用的。


编辑 :我明白我应该覆盖默认行为,这就是为什么我提到实现:)。 而且我确实得到了在GUI中需要字符串表示的一些组件中覆盖它的价值。 但是,至少在JDK中,我看到许多只在需要调试对象实例时才会使用的实现。

为什么它以Object类为根,因为这对GUI /调试东西似乎有用? 还有其他我不知道的用途吗?

只要您想要对象的字符串表示,toString()就很有用。 当然,这是出于调试目的,但也可以有效地将操作结果输出给用户。

例如,假设您有一个处理复数的Complex类。 如果你想以3 + 2i这样的格式将它们打印给用户,如果它们定义toString()就很方便,因为你不必每次都写入格式并且输出是一致的。 如果您想要更改该表示forms,例如更改为3 + 2j ,则只需触摸Complex类中的toString()方法即可。

所以toString()也不是为了调试目的,而是获得对象的一致字符串表示的好方法。

不,关键是您应该覆盖ToString()的默认实现以使其有用。 ToString()可以是将某些内容的值输出回UI的好方法。

一个简单的例子就是如果你有一个带有三个字符串的Name类(First,Middle,Last)。 您可以使用ToString()方法为UI格式化它:例如,“Last,First Middle”。

或者存储数学运算的类(值Left = 2,Right = 3,Result = 6,运算符enum = Multiply)。 调用ToString()得到“2 * 3 = 6”。

但是 ,拥有各种不同的ToString()方法(如.NET DateTimeToString()可能更为常见。 ( ToShortDateString()ToLongDateString()ToLongTimeString() ,…)

编辑:至于为什么它根植于Object类,它只是因为ToString()任何东西的有效操作。

此外,字符串可以是数据类型或数据使用者之间编组的好方法,因为它(实际上)保证可以解析并且不需要额外的编码或关注。

我个人的偏好是toString() 永远不应该用于除调试之外的任何事情。 如果要为对象生成字符串,请提供一个单独的方法,清楚地记录您的意图(getName(),getDescription()等)。 永远不要依赖于toString()的实现。

问题是许多开发人员将toString()视为调试级别的字符串,并且不考虑更改它(比如添加或删除新字段时)。 哎呀,一些自动化的toString()构建器使用reflection从字段生成一个toString()。

我发现这种偏好多年来一直很好用。

我只能说,当我改变我的类的toString以显示一些额外的调试信息时,我已经有了代码中断。

有问题的代码是一个GUI库,它决定使用toString的值作为一些内部事物(几年前它……我忘记了它究竟是什么)。 最终结果是我不再使用该库了。

我会说,因为很多人都认为toString用于调试(无论你认为它应该用于什么),使用从它返回的值来做任何编程都是有问题的(比如解析它)或将其显示给用户。

如果您100%控制toString方法,那么无论如何都要做你想要的。

所以,回答这个问题,没有toString不仅对调试很有用,你可以随心所欲地做任何事情。 但是,如果toString发生变化会让你感到不快,也不要感到惊讶。

根据我的经验,toString()在调试和日志记录之外几乎没有价值。 你不能随着时间的推移依赖它的格式或内容,所以除了人类可读之外,除了最简单的对象(例如原始对象类型)之外,不要依赖它。 如果有多个数据成员,则期望它们可能随着时间的推移而改变类型或数量,并且toString()的输出也会随之改变。

我想强烈提出的另一点。 不要在toString()中调用其他方法。 没有什么比在调试器中检查断点上的变量内容更糟糕了,然后由于toString()中的方法调用而执行更多的代码。

我认为重要的是指出那些回答提到“toString”的人注意到小写的“t”通常是在谈论Java,回答提到“ToString”的人通常都是指C#。 当然,这不适用于所有回复。

在我自己的观察中(我每天都使用),鼓励C#中的程序员覆盖“ToString”以显示有用的文本表示。 然而,在Java中,我几乎没有看到这一点。 事实上,我很少看到这一点。

-J.P

首先, toString方法应返回对象的人类可读文本表示。

这个问题在Effective Java中提到,如第10项:始终覆盖toString

它引用了Object.toString方法的Java API规范 :

结果应该是简洁但信息丰富的表示,便于人们阅读。

除了调试之外,在将对象放入JListJTable时,覆盖类的toString方法会很有用,默认情况下,它会使用toString方法将对象显示为列表或表中的文本forms。

例如,在我的例子中,我重写了添加到JList的对象的toString方法,以便用户能够通过GUI查看列表中项目的相关信息。

因此,确实存在toString方法对除调试之外的情况有用的情况。 关键是让toString方法返回实际对人有用的信息,而不是默认的Object.toString实现,其中对象的内存位置用于其文本表示。

对…有用

  1. Gui(使用PropertyGrid时的复杂属性,表头文本)
  2. DataBinding(这就是它的工作方式)

以及任何其他字符串输出。

在将任何对象打印到字符串时,.NET Framework也会隐式调用ToString()。

 Console.WriteLine("My Object is" + object.ToString()); 

相当于

 Console.WriteLine("My Object is" + object); 

因为隐式调用ToString()。

我相信,虽然不确定,调试器使用它来获取对象的“值”。 这可能相当方便,但有限。 在大多数情况下,编写自己的调试器可视化器会更好。

在AS3上,我不得不将2D数组转换为1D数组。 最快(运行速度)和最简单(编码时间)的解决方案是:

 var new1DArray:Array = the2DArray.toString().split(","); 

感到惊讶,但它实际上正如预期的那样工作,也非常快!

我使用ToString()一吨日期时间格式。

http://hunterconcepts.com/content/tools/formats/

除了其他人已经说过的内容之外,在使用调用它的控件时,重写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. 

它可能不是“用心”的用途,但我用它来进行数据序列化

 storeToHardDrive(studentList.ToString());