何时在 API 中使用字符序列
我正在为一个包设计一个公共接口(API)。我想知道,我是否应该通常使用而不是.(我主要谈论的是公共接口)。CharSequence
String
这样做有什么缺点吗?这是否被认为是一种好的做法?
如何将其用于类似标识符的目的(当值与基于哈希的容器中的集合匹配时)?
我正在为一个包设计一个公共接口(API)。我想知道,我是否应该通常使用而不是.(我主要谈论的是公共接口)。CharSequence
String
这样做有什么缺点吗?这是否被认为是一种好的做法?
如何将其用于类似标识符的目的(当值与基于哈希的容器中的集合匹配时)?
字符序列
很少用于通用库。当您的主要用例是字符串处理(操作,解析等)时,通常应该使用它。
一般来说,你可以用 a 做任何事情,你可以用 a 做任何事情(微不足道,因为你可以将每个 CharSequence
转换为 String
)。但有一个重要的区别:字符序列
不能保证是不可变的!每当您在两个不同的时间点处理和检查它时,都可以确保它每次都具有相同的值。CharSequence
String
String
但对于论坛来说,这不一定是真的。例如,有人可以将StringBuilder
传递到您的方法中,并在您使用它时对其进行修改,这可能会破坏许多合理的代码。CharSequence
请考虑以下伪代码:
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
如果您接受,则应记录您的 API 如何处理可变对象。例如:“在方法执行时修改参数会导致未定义的行为。CharSequence
CharSequence
这确实取决于你需要什么,我想陈述两个优点,但是。String
每个对象都可以由不同的类实现,并且不能保证每个类都能够测试其实例是否与另一个类的实例相等。因此,将任意 CharSequence 实例用作集合中的元素或映射中的键是不合适的。
因此,每当您需要或可靠的 /时,都需要将实例复制到(或其他)中。Map
equals
hashCode
String
此外,我认为没有明确提到实现必须是不可变的。您可能需要进行防御性复制,这可能会减慢您的实现速度。CharSequence