-->

当使用CharSequence的一个API中(When to use CharSequence in

2019-07-03 14:27发布

我设计了一个包一个公共接口(API)。 我不知道,我应该使用CharSequence一般,而不是String 。 (我主要讲的是公共接口)。

是否有这样做的任何缺点? 它是一种良好实践?

样使用它的标识符状目的(当此值被与一组在基于散列的容器匹配的)?

Answer 1:

CharSequence是通用库很少使用。 当你的主要用途的情况是字符串处理(处理,解析,......),它通常应该使用。

一般来说 ,你可以做任何事情与CharSequence ,你可以用做String (平凡的,因为你可以每次转换CharSequenceString )。 但是有一个重要的区别: 一个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对象。 例如:“修改的参数,而该方法执行在未定义的行为的结果。”



Answer 2:

这并不取决于你需要什么,我想说明的两个优点String ,但是。

CharSequence的文档 :

每个对象可以由不同的类来实现,并且也不能保证每个类将是能够测试其实例为与另一个的平等的。 因此,不宜使用任意CharSequence实例作为集合中的元素或以在映射键。

因此,当你需要一个Map或可靠equals / hashCode ,你需要实例复制到一个String (或其他)。

此外,我想CharSequence没有明确提到的实现必须是不可变的。 你可能需要做防御性的复制可以实现你减慢。



Answer 3:

Java的CharSequence是一个接口。 由于API称, CharSequence已实现CharBufferSegmentStringStringBufferStringBuilder类。 所以,如果你想从所有这些类访问或接受你的API,然后CharSequence是你的选择。 如果没有,那么String是一个公共的API非常好,因为它是很容易与每个人都知道这件事。 记住CharSequence只给你4的方法,所以如果你接受CharSequence通过一个方法对象,那么你的输入操作的能力将受到限制。



Answer 4:

如果一个参数是概念字符序列,使用的CharSequence。

字符串是技术上字符序列,但大多数情况下,我们不认为它像; 字符串是多个原子/整体性的,我们通常不会关心个人的字符。

想想INT - 尽管一个int在技术上是位序列,我们通常不会关心各个位。 我们操纵整数为原子的事情。

所以,如果你要在一个参数做的主要工作是通过它的字符进行迭代,使用的CharSequence。 如果你要处理的参数作为一个原子的事情,用String。



Answer 5:

您可以实现CharSequence握住你的密码,因为的使用String被鼓励用于这一目的。 实施应该有抹了纯文本数据的Dispose方法。



文章来源: When to use CharSequence in an API