【问题标题】:Does String's toString() method have any practical purpose?String 的 toString() 方法有什么实际用途吗?
【发布时间】:2012-07-08 20:22:58
【问题描述】:

我正在阅读 the docs 并注意到了它。从来没有想过。说明:

这个对象(它已经是一个字符串!)本身被返回。

除了填充约定或使用计算资源之外,Java 中的 .toString()String 有什么作用,而使用 String 本身不会?为什么不简单地从类java.lang.Object 继承.toString()

编辑:

我知道在多态的情况下,必须存在自己的 toString() 方法,因为它会覆盖其父级的 toString()。在第一个问题中我想知道的是,在使用stringVariable/"String value" 和使用stringVariable.toString()/"String value".toString() 之间是否有任何不同的情况。

例如。 gr.: 像System.out.println(stringVariable.toString()); 这样的输出操作或像stringVariable = "String value".toString(); 这样的赋值操作。

【问题讨论】:

  • 您好。如果您在解除暂停后看不到它,JohnDoDo 会对 Jon 的回答发表评论。 FWIW,如果您返回,请考虑恢复所有未接受的答案 - 如果他们当时足以接受,那些乐于助人的人将因他们无法控制的事件而受到惩罚。

标签: java string tostring


【解决方案1】:

除了填充约定或使用计算资源之外,Java 中的 .toString() 对使用 String 本身不会的 String 做了什么?

这意味着它在多态调用时会给出适当的结果。

为什么不简单地从类 java.lang.Object 继承 .toString()?

因为这不会给出相同的结果,而且几乎可以肯定不是想要的结果。

Object.toString() 旨在提供对象的合理有用的字符串表示。 Object 实现提供了有关类型和值的信息,可用于粗略的身份提示(诊断上有用,但仅此而已)。这显然不是对字符串最有用的字符串表示 - 字符串本身就是。

虽然我说很遗憾toString 的定义非常模糊(不清楚结果是用于机器、开发人员还是用户消费),但感觉很明显对我来说,String 会在实现中返回自身。

【讨论】:

  • Effective Java item 10 讨论了避免完全指定 toString() 的一些原因:因为有人会不可避免地认为解析它是个好主意。
  • @TrevorTrovalds:文档不是已经回答了吗?它返回“这个对象” - 所以不,没有任何情况使用foofoo.toString() 会给出不同的结果,其中foo 是对String 的非空引用。
  • @TrevorTrovalds:嗯,是的 - 虽然我不会将它用于此目的。
  • @Trevor... 我正在挠头,试图设想这样一个场景:使用str.toString() 抛出 NPE 会比 if str == null 检查更好...
  • @user985358:特雷弗,你最近和其他人一样不接受这个答案。这个答案或其他答案是否有问题,或者您有其他理由不接受这么多答案?
【解决方案2】:

实际例子:

public abstract class MetadataProcessor {

protected void processMetadata() {    
   Map<String, Object> metadata = getMetadata();
   for(String key : metadata.keySet()) {
      if(metadata.get(key) instanceof Date) {
      processDate(metadata.get(key));
   } else { //String or any other object type
      processString(metadata.get(key).toString());
   }
}

private void processDate(Date date) {
   (...)
}

private void processString(String string) {
   (...)
}

/**
* contains document's metadata, values must be String or Date
**/
protected abstract Map<String, Object> getMetadata();
}

如果 String 的 .toString() 不会返回 String 本身,则上述代码中需要额外的 if(foo instanceof String)

【讨论】:

    【解决方案3】:
    public final class String
    extends Object
    implements Serializable, Comparable<String>, CharSequence
    

    见:https://docs.oracle.com/javase/10/docs/api/java/lang/String.html

    所有对象都有toString() 方法(参见https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#toString())。 String 是一种对象,因此,它还需要一个方法 toString() 来实现其基类中的方法。

    【讨论】:

      【解决方案4】:

      显然是旧的,但另一个避免 (foo instanceof String) 需要的答案是在处理泛型时。

      获取每个对象的字符串表示会很烦人,但是字符串是一个奇怪的人,需要额外的代码才能获得相同的结果。

      【讨论】:

        【解决方案5】:

        在java中实现toString方法是通过覆盖ObjecttoString方法来完成的。当我们需要对象的字符串表示时,使用 java toString() 方法。它在Object 类中定义。可以重写此方法以自定义ObjectString 表示。

        【讨论】:

          猜你喜欢
          • 2019-03-03
          • 2012-12-31
          • 2011-05-04
          • 2011-05-06
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-07
          相关资源
          最近更新 更多