何时在API中使用CharSequence

时间:2012-11-05 14:54:57

标签: java charsequence

我正在为包设计一个公共接口(API)。我想知道,我应该使用CharSequence而不是String。 (我主要谈的是公共接口)。

这样做有什么缺点吗?这被认为是一种好习惯吗?

如何将其用于类似标识符的目的(当值与基于散列的容器中的集合匹配时)?

5 个答案:

答案 0 :(得分:30)

CharSequence很少用于通用库。当你的主要用例是字符串处理(操作,解析,......)时,通常应该使用它。

一般来说你可以使用CharSequenceString({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,那么它几乎可以工作(除非可能会计算两次值)。但如果somethingCharSequence,则其内容可能会在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已在CharBufferSegmentStringStringBufferStringBuilder类中实施。因此,如果您想要从所有这些类访问或接受您的API,那么CharSequence是您的选择。如果没有,则String对于公共API非常有用,因为它非常简单&大家都知道。请记住CharSequence只提供4种方法,因此如果您通过某种方法接受CharSequence对象,那么您的输入操作功能将受到限制。

答案 3 :(得分:3)

如果参数在概念上是一系列字符,请使用CharSequence。

字符串在技术上是一系列字符,但我们通常不会这样想;一个字符串更原子/整体,我们通常不关心个别字符。

考虑一下int - 虽然int在技术上是一个位序列,但我们通常不关心单个位。我们将int作为原子事物来操纵。

因此,如果您要对参数执行的主要工作是迭代其字符,请使用CharSequence。如果要将参数作为原子操作,请使用String。

答案 4 :(得分:0)

您可以实施CharSequence来保存您的密码,因为usage of String is discouraged就是为了这个目的。实现应该有一个dispose方法来清除纯文本数据。