java - 何时在 API 中使用 CharSequence

标签 java charsequence

我正在为一个包设计一个公共(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,它几乎可以正常工作(除了该值可能会被计算两次)。但是如果 somethingCharSequence 那么它的内容可能会在 getFromCache 调用和 computeValue 调用之间改变。或者更糟:在 computeValue 调用和 putIntoCache 调用之间!

因此:只有接受 CharSequence 如果有很大的优势并且您知道缺点

如果您接受 CharSequence,您应该记录您的 API 如何处理可变 CharSequence 对象。例如:“在方法执行时修改参数会导致未定义的行为。”

关于java - 何时在 API 中使用 CharSequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13234584/

相关文章:

java - 性能问题 : use Singleton object in multi thread environment

java - Thymeleaf 和 Spring boot 以及 Spring security 不工作

java - int 无法转换为 charsequence

java - 如何将字符串转换为 CharSequence?

java - Java中CharSequence和String之间的确切区别

java - 如何从 jtextArea 或 JEditorPane 获取控制台输入和输出

java - 可以有多个 AWT 事件队列吗?

java - 在单个模型 Hibernate Spring 中将两个表连接到第三个表

java - 在 Android 中将字节数组转换为字符序列

java - 为什么函数参数不调用toString?