vbe*_*nce 22 java charsequence
我正在为包设计一个公共接口(API).我想知道,我应该CharSequence普遍使用而不是String.(我主要谈的是公共接口).
这样做有什么缺点吗?这被认为是一种好习惯吗?
如何将它用于类似标识符的目的(当值与基于散列的容器中的集合匹配时)?
Joa*_*uer 31
CharSequence很少用于通用库.当你的主要用例是字符串处理(操作,解析,......)时,通常应该使用它.
一般来说,你可以做CharSequence一些你可以用a 做的事情(通常String,因为你可以将每个转换CharSequence为aString).但是有一个重要的区别: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;
}
Run Code Online (Sandbox Code Playgroud)
这看起来很无害,如果你已经在String这里使用过,它大部分都会起作用(除非可能会计算两次这个值).但如果something是,CharSequence则其内容可能会在getFromCache通话和computeValue通话之间发生变化.或者更糟糕的是:在computeValue通话和putIntoCache通话之间!
因此:只有CharSequence在有很大优势并且了解其缺点的情况下才能接受.
如果您接受CharSequence,则应记录您的API如何处理可变CharSequence对象.例如:"在方法执行时修改参数会导致未定义的行为."
这取决于你需要什么,但我想说明两个优点String.
每个对象可以由不同的类实现,并且不能保证每个类能够测试其实例与另一个的实例是否相等.因此,将任意CharSequence实例用作集合中的元素或映射中的键是不合适的.
因此,无论何时需要Map或者需要equals/ hashCode,都需要将实例复制到String(或其他)中.
而且,我认为CharSequence没有明确提到实现必须是不可变的.您可能需要进行防御性复制,这可能会降低您的实施速度.
Java CharSequence是一个接口.由于API称,CharSequence已得到落实CharBuffer,Segment,String,StringBuffer,StringBuilder类.因此,如果您想要从所有这些类访问或接受您的API,那么CharSequence您可以选择.如果没有,那么String对于公共API非常有用,因为它很容易并且每个人都知道它.记住CharSequence只给你4个方法,所以如果你CharSequence通过一个方法接受一个对象,那么你的输入操作能力将受到限制.
| 归档时间: |
|
| 查看次数: |
8374 次 |
| 最近记录: |