java - java.net.URL 上的 toExternalForm 和 toString 之间是否存在语义差异?

标签 java

一个的实现只是简单地委托(delegate)给另一个,这向我表明,从接口(interface)的角度来看,两者之间存在语义差异——或者至少,有人在某些时候是这样认为的。任何人都可以在那里发光吗?

编辑:我已经知道 toString 的实现代表toExternalForm .这是我说的第一件事。 :) 我在问 为什么这种重复是存在的——这就是我所说的“语义”差异。

最佳答案

javadocs为这两个 toString()toExternalForm() ,

Constructs a string representation of this URL. The string is created by calling the toExternalForm method of the stream protocol handler for this object.


换句话说,这两种方法被指定为返回相同的值。

为什么?
很难找到 URL 的真正原因。 API 就是这样设计的。这些决定是在大约 25 年前做出的。人们不会记得, session 记录(如果他们被拿走了)可能已经丢失或处理掉了。
但是,我想推理会是这样的:
  • Object.toString()方法有一个非常松散的规范。它基本上只是返回可能对调试有用的东西。
  • 设计者可能决定他们想要一种具有明确和特定行为的方法来将 URL 字符串化。目的。他们称之为URL.toExternalForm() .
  • 设计并实现了URL.toExternalForm()可能有人认为:

    "Oh ... now I have a good way to implement URL.toString()".


  • 最后,他们可能决定指定这两种方法返回相同的东西。

  • 在 Java 1.0 和 Java 1.1 之间做出了指定这两种方法返回相同内容的决定。 (Google 获取 Java 1.0 和 1.1 文档并查看各自的 javadocs。)
    这表明第 4 步是在原始实现“事后”完成的。 (我们需要查看原始源代码和提交历史来确认这一点,但它不可用。)

    关于java - java.net.URL 上的 toExternalForm 和 toString 之间是否存在语义差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61346354/

    相关文章:

    java - 如何组织包(并防止依赖循环)?

    java - 如何在 Java 中删除字符串中的重复字符并修剪字符串中的空格?

    java - Hibernate监听器性能和loadeventlistener

    java - 使用 Redis 运行 Storm 时出错 : java. lang.NoClassDefFoundError: Lredis/clients/jedis/Jedis

    java - 将无符号 32 位整数拆分为两个可重建的 16 位数字

    Java 8 通用函数映射

    java - DynamoDB 中的全局二级索引是否需要唯一?

    java - 异常 Selenium Webdriver TestNg

    java - String.format 获取 dd-MMM-YYYY HH :mm pattern (Java) 格式的输出日期

    java - 我应该使用 KeyGenerator 还是 SecretKeyFactory?