我正在为包设计一个公共接口(API)。我想知道,我应该使用CharSequence
而不是String
。 (我主要谈的是公共接口)。
这样做有什么缺点吗?这被认为是一种好习惯吗?
如何将其用于类似标识符的目的(当值与基于散列的容器中的集合匹配时)?
答案 0 :(得分:30)
CharSequence
很少用于通用库。当你的主要用例是字符串处理(操作,解析,......)时,通常应该使用它。
一般来说你可以使用CharSequence
做String
({1}}可以做的任何事情(因为你可以convert every CharSequence
into a String
)。但是有一个重要的区别: A 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
个对象。例如:“在方法执行时修改参数会导致未定义的行为。”
答案 1 :(得分:6)
这取决于你需要什么,我想说明String
的两个优点。
来自CharSequence
's documentation:
每个对象可以由不同的类实现,而没有 保证每个类都能够测试其实例 与另一方的平等。因此使用起来不合适 任意CharSequence实例作为集合中的元素或作为键中的键 地图。
因此,只要您需要Map
或可靠equals
/ hashCode
,就需要将实例复制到String
(或其他)。
此外,我认为CharSequence
没有明确提到实现必须是不可变的。您可能需要进行防御性复制,这可能会降低您的实施速度。
答案 2 :(得分:5)
Java CharSequence
是一个接口。正如API所说,CharSequence
已在CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
类中实施。因此,如果您想要从所有这些类访问或接受您的API,那么CharSequence
是您的选择。如果没有,则String
对于公共API非常有用,因为它非常简单&大家都知道。请记住CharSequence
只提供4种方法,因此如果您通过某种方法接受CharSequence
对象,那么您的输入操作功能将受到限制。
答案 3 :(得分:3)
如果参数在概念上是一系列字符,请使用CharSequence。
字符串在技术上是一系列字符,但我们通常不会这样想;一个字符串更原子/整体,我们通常不关心个别字符。
考虑一下int - 虽然int在技术上是一个位序列,但我们通常不关心单个位。我们将int作为原子事物来操纵。
因此,如果您要对参数执行的主要工作是迭代其字符,请使用CharSequence。如果要将参数作为原子操作,请使用String。
答案 4 :(得分:0)
您可以实施CharSequence
来保存您的密码,因为usage of String
is discouraged就是为了这个目的。实现应该有一个dispose方法来清除纯文本数据。