我正在为一个包设计公共接口(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
对象。例如:“在方法执行时修改参数会导致未定义的行为。”CharSequence
可能很有用(例如能够记录StringBuilder
)。解析器是另一个应该接受CharSequence
的示例:它不需要将所有内容存储在内存中,只需要能够迭代每个字符。 - Joachim SauerString
的两个优点。CharSequence
文档 中可以看到:equals
/hashCode
或者 Map
时,就需要将实例复制到 String
(或其他)中。CharSequence
没有明确提到实现必须是不可变的。您可能需要进行防御性拷贝,这可能会减慢您的实现速度。Java CharSequence
是一个接口。根据API的说法,CharSequence
已经在CharBuffer
,Segment
,String
,StringBuffer
和StringBuilder
类中实现。因此,如果您想从所有这些类中访问或接受您的API,则选择CharSequence
。如果不需要,则String
非常适合公共API,因为它非常简单且人人都知道。请记住,CharSequence
只给您4种方法,因此,如果通过方法接受CharSequence
对象,则输入操作能力将受到限制。
toString()
,因此任何可以使用 String 的操作都可以在任意 CharSequence 上执行(只需调用它的 toString() 方法,并使用您想要的任何操作能力)。 - Andrzej DoyletoString()
的实现可能非常昂贵。大多数实现需要将整个字符序列复制到新数组中。如果你的第一步是从 CharSequence
获取一个 String
,那么你为隐藏性能损失提供了灵活性。这并没有太多价值,最好使用一个 String
并让用户进行转换,这样他们就非常清楚这种惩罚的代价。 - Mark PetersCharSequence.toString()
方法进一步操作输入,那么为什么不直接将输入作为String
接受呢?这样您就不必将CharSequence
转换为String
了。 - SajithACharSequence
就是你的选择。我认为那个句子有点倒过来了;你的API应该接受CharSequence
,而不是相反。 "...然后对于公共API,String
非常好,因为它非常容易。" 真的吗?我认为可以从String
API中学到很多东西(即使仅仅是正则表达式)。最后一点:CharSequence
的这两种方法可能会比 String
给你带来优势:subSequence
和 charAt
。 - Maarten Bodewes