我最近在this问题中感到很沮丧,其中OP希望根据格式化数字的特征来更改输出的格式。
自然机制是动态构造格式,但因为PrintStream.format
需要String
而不是CharSequence
,构造必须以String
的构造结束。
构建一个实现CharSequence
的类可以更加自然和高效,它可以动态提供动态格式,而无需再创建另一个String
。
这似乎是Java库中的一个常见主题,其中默认似乎需要String
,即使不要求不可变性。我知道Map
和Set
中的密钥通常应该是不可变的,原因很明显但是据我所知String
CharSequence
{{1}}就够了。
答案 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以来一直存在)