2

我最近对这个问题感到沮丧,其中 OP 想要根据被格式化的数字的特征来改变输出的格式。

自然的机制是动态地构造格式,但因为PrintStream.format采用 aString而不是 aCharSequence构造必须以 a 的构造结束String

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

这似乎是 Java 库中的一个常见主题,默认情况下似乎需要 aString即使不变性不是必需的。我知道由于显而易见的原因, Maps 和Sets 中的键通常应该是不可变的,但据我所知,在 a就足够String的地方经常使用。CharSequence

4

2 回答 2

2

有几个原因。

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

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

  • 在很多情况下,原因是向后兼容。该CharSequence接口是在 Java 1.4 中引入的。Java 1.4 之前的 Java API 不使用它。此外,更改用于使用的预先存在的方法可能StringCharSequence导致二进制兼容性问题;即它可以防止旧的Java 代码在新的JVM 上运行。

  • 剩下的可能只是——“工作太多,时间太少”。对现有的标准 API 进行更改需要付出很多努力,以确保每个人都可以接受更改(例如检查上述内容),并每个人相信一切都会好起来的。工作必须优先。

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


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

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

于 2013-11-03T01:04:23.710 回答
1

请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/CharSequence.html

您是否注意到解释它自 1.4 以来一直存在的部分?以前使用的所有 API 方法String(自 1.0 以来一直存在)

于 2013-11-03T00:29:22.240 回答