我设计了一个包一个公共接口(API)。 我不知道,我应该使用CharSequence
一般,而不是String
。 (我主要讲的是公共接口)。
是否有这样做的任何缺点? 它是一种良好实践?
样使用它的标识符状目的(当此值被与一组在基于散列的容器匹配的)?
我设计了一个包一个公共接口(API)。 我不知道,我应该使用CharSequence
一般,而不是String
。 (我主要讲的是公共接口)。
是否有这样做的任何缺点? 它是一种良好实践?
样使用它的标识符状目的(当此值被与一组在基于散列的容器匹配的)?
CharSequence
是通用库很少使用。 当你的主要用途的情况是字符串处理(处理,解析,......),它通常应该使用。
一般来说 ,你可以做任何事情与CharSequence
,你可以用做String
(平凡的,因为你可以每次转换CharSequence
成String
)。 但是有一个重要的区别: 一个CharSequence
是不能保证是一成不变的! 当你处理String
,并在时间上两个不同的点检查它,你可以肯定,它每次都会有相同的值。
但是,对于一个CharSequence
这未必是真实的。 例如有人可能会传递一个StringBuilder
进入你的方法,并修改它,而你用它做什么 ,它可以打破很多理智的代码。
考虑这个伪代码:
public Object frobnicate(CharSequence something) {
Object o = getFromCache(something);
if (o == null) {
o = computeValue(something);
putIntoCache(o, something);
}
return o;
}
这看起来很无害的,如果你已经使用String
这将主要工作(可能除了该值可能被两次计算)。 但是,如果something
是CharSequence
那么它的内容可以在之间改变getFromCache
调用和computeValue
通话。 或者更糟:之间computeValue
呼叫和putIntoCache
来电!
因此: 只接受CharSequence
如果有大的优势 ,你知道的缺点 。
如果你接受CharSequence
你应该记录您的API如何处理可变CharSequence
对象。 例如:“修改的参数,而该方法执行在未定义的行为的结果。”
这并不取决于你需要什么,我想说明的两个优点String
,但是。
从CharSequence
的文档 :
每个对象可以由不同的类来实现,并且也不能保证每个类将是能够测试其实例为与另一个的平等的。 因此,不宜使用任意CharSequence实例作为集合中的元素或以在映射键。
因此,当你需要一个Map
或可靠equals
/ hashCode
,你需要实例复制到一个String
(或其他)。
此外,我想CharSequence
没有明确提到的实现必须是不可变的。 你可能需要做防御性的复制可以实现你减慢。
Java的CharSequence
是一个接口。 由于API称, CharSequence
已实现CharBuffer
, Segment
, String
, StringBuffer
, StringBuilder
类。 所以,如果你想从所有这些类访问或接受你的API,然后CharSequence
是你的选择。 如果没有,那么String
是一个公共的API非常好,因为它是很容易与每个人都知道这件事。 记住CharSequence
只给你4的方法,所以如果你接受CharSequence
通过一个方法对象,那么你的输入操作的能力将受到限制。
如果一个参数是概念字符序列,使用的CharSequence。
字符串是技术上字符序列,但大多数情况下,我们不认为它像; 字符串是多个原子/整体性的,我们通常不会关心个人的字符。
想想INT - 尽管一个int在技术上是位序列,我们通常不会关心各个位。 我们操纵整数为原子的事情。
所以,如果你要在一个参数做的主要工作是通过它的字符进行迭代,使用的CharSequence。 如果你要处理的参数作为一个原子的事情,用String。
您可以实现CharSequence
握住你的密码,因为的使用String
被鼓励用于这一目的。 实施应该有抹了纯文本数据的Dispose方法。