当前位置:  开发笔记 > 编程语言 > 正文

toString()只对调试有用吗?

如何解决《toString()只对调试有用吗?》经验,为你挑选了4个好方法。

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


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

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



1> lc...:

不,关键是您应该覆盖默认实现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 DateTime类)可能更为常见.(ToShortDateString(),ToLongDateString(),ToLongTimeString(),...)

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

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


通常不利于用户界面,因为它不需要用户区域设置.调试无关紧要,对最终用户来说无关紧要.
对于Java,我完全不同意这个答案.对于C#,我不知道接受的做法是什么.将问题定位到多种语言必然会根据该语言的公认惯例得到不同的结果.

2> Alex Miller..:

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

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

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



3> raimue..:

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

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

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



4> TofuBeer..:

我可以说的是,当我更改类的toString以显示一些额外的调试信息时,我已经有代码中断了.

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

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

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

所以,回答这个问题,没有toString不仅对调试很有用,你可以随心所欲地做任何事情.但是,如果toString以令你不快乐的方式改变,不要感到惊讶.


我只能说除了调试之外,它是一个非常非常漏洞的抽象:)
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有