gpt4 book ai didi

java - 为什么这么多 Java 库采用 `String` 而 `CharSequence` 可以呢?

转载 作者:行者123 更新时间:2023-11-30 08:29:05 25 4
gpt4 key购买 nike

我最近很沮丧this OP 想根据正在格式化的数字的特征更改输出格式的问题。

自然的机制是动态构造格式,但是因为 PrintStream.format 采用 String 而不是 CharSequence 构造必须结束在 String 的构造中。

构建一个实现 CharSequence 的类会更加自然和高效,该类可以动态提供动态格式,而无需创建另一个 String

这似乎是 Java 库中的一个常见主题,默认情况下似乎需要 String,即使不可变性不是必需的。我知道 MapSet 中的键由于显而易见的原因通常应该是不可变的,但据我所知 String 被使用得很远CharSequence 就足够了。

最佳答案

有几个原因。

  • 在很多情况下,不变性是一项功能要求。例如,您已经确定如果元素或键发生变化,许多集合/集合类型将“中断”。

  • 在很多情况下,不变性是一项安全要求。例如,在沙箱中运行不受信任代码的环境中,任何不受信任代码可以将 StringBuilder 而不是 String 传递给受信任代码的情况都是潜在的安全性问题1

  • 在很多情况下,原因是向后兼容。 CharSequence 接口(interface)是在 Java 1.4 中引入的。早于 Java 1.4 的 Java API 不使用它。此外,将使用 String 的现有方法更改为使用 CharSequence 存在二进制兼容性问题;即它可以防止旧的 Java 代码在更新的 JVM 上运行。

  • 在其余部分,它可能只是 - “工作太多,时间太少”。对现有标准 API 进行更改需要付出大量努力,以确保每个人都能接受更改(例如检查上述内容),并说服每个人一切都会好起来的。必须优先考虑工作。

因此,尽管您发现这令人沮丧,但这是不可避免的。


1 - 这会给 Java API 设计者留下一个尴尬的选择。他/她是否编写 API 以在传递可变“字符串”时制作(昂贵的)防御性副本,并可能更改 API 的语义(从用户的角度来看!)。或者他/她是否将 API 标记为“对于不受信任的代码不安全”……并希望开发人员注意/理解?

当然,当您出于自己的原因设计自己的 API 时,您可以断言安全性不是问题。 Java API 设计者不在那个位置。他们需要设计适用于所有人的 API。使用 String 是最简单/风险最小的解决方案。

关于java - 为什么这么多 Java 库采用 `String` 而 `CharSequence` 可以呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com