为什么这么多的Java库采用`String`来实现`CharSequence`呢?

时间:2013-11-03 00:27:41

标签: java string charsequence

我最近在this问题中感到很沮丧,其中OP希望根据格式化数字的特征来更改输出的格式。

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

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

这似乎是Java库中的一个常见主题,其中默认似乎需要String,即使不要求不可变性。我知道MapSet中的密钥通常应该是不可变的,原因很明显但是据我所知String CharSequence {{1}}就够了。

2 个答案:

答案 0 :(得分:2)

有几个原因。

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

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

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

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

所以当你发现这令人沮丧时,这是不可避免的。


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

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

答案 1 :(得分:1)

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

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