我正在为一个包设计一个公共(public)接口(interface) (API)。我想知道,我应该通常使用 CharSequence
而不是 String
。 (我主要说的是公共(public)接口(interface))。
这样做有什么缺点吗?这被认为是一种好的做法吗?
如果将它用于类似标识符的目的(当值与基于哈希的容器中的集合匹配时)呢?
最佳答案
CharSequence
在通用库中很少使用。当您的主要用例是字符串处理(操作、解析等)时,通常应该使用它。
一般来说你可以用 CharSequence
做任何你可以用 String
做的事情(很简单,因为你可以 convert every CharSequence
into a 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
对象。例如:“在方法执行时修改参数会导致未定义的行为。”
关于java - 何时在 API 中使用 CharSequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13234584/