在 API 的 CharSequence 和 String 之间进行选择 [duplicate]

Choosing between CharSequence and String for an API [duplicate]

提问人:Raedwald 提问时间:12/9/2011 最后编辑:CommunityRaedwald 更新时间:11/13/2019 访问量:3922

问:

String 是 CharSequence。Java 库中的许多方法都接受,因此它们可以更普遍地运行。有些类有一个方法(例如,),并且还使用等效方法(例如,)实现。CharSequenceStringWriter.write(String)AppendableCharSequenceWriter.append(CharSequence)

如果我正在编写一个委托给此类类的类,并且需要一些文本输入,我可以选择该输入是 a 或 .选择后者通过为客户提供更多选择,使类更加灵活。但是我没有看到很多代码这样做:文本参数几乎总是 a 而不是 .使用有缺点吗?性能是否受到影响?还是只是程序员的无知或无知导致了使用而不是?StringCharSequenceStringCharSequenceCharSequenceStringCharSequence

比较

class XMLWriter {
   private final Writer writer;

   // more stuff here

   public void writeComment(String text) {
      writer.write("<!-- ");
      writer.write(text);
      writer.write(" -->");
   }
}

class XMLWriter {
   private final Writer writer;

   // more stuff here

   public void writeComment(CharSequence text) {
      writer.write("<!-- ");
      writer.append(text);
      writer.write(" -->");
   }
}
Java 字符串 字符序列

评论

1赞 Andy 12/9/2011
你的逻辑对我来说很有意义。通过使用 CharSequence,您可以允许调用代码来提供 StringBuffer/StringBuilder,而无需对其调用 toString() - 这种情况经常发生。
0赞 Raedwald 12/9/2011
@Andy是的,我在写这个问题时就想到了。StringBuilder
0赞 Basil Bourque 7/2/2015
请参阅此问题的后面副本,何时在 API 中使用 CharSequence
0赞 Basil Bourque 7/2/2015
有关更多讨论,另请参阅问题 CharSequence VS String in Java?,及其重复项 Exact difference between CharSequence and String in java。还有我的班级图
0赞 Duncan Jones 5/21/2017
作为新问题的重复而关闭,因为该问题吸引了一些彻底的答案。

答:

16赞 Dhananjay 12/9/2011 #1

引用 CharSequence Javadoc:

此接口不细化 equalshashCode 方法的一般约定。因此,测试实现相等的两个对象的结果通常是未定义的。每个对象可以由不同的类实现,并且不能保证每个类都能够测试其实例是否与另一个类的实例相等。因此,不宜将任意实例用作集合中的元素或映射中的键。CharSequenceCharSequence

因此,IMO:在使用 CharSequnce 作为 String 的替代品之前,我们必须三思而后行。

评论

0赞 Raedwald 12/12/2011
你会说只输出文本的方法,比如我的例子,应该使用而不是?CharSequenceString
1赞 Basil Bourque 11/13/2019
好答案,感谢您引用 Javadoc。但我不同意你的结论。使用某些 API 返回的问题属于调用程序员,而不是 API 的作者。如果调用程序员将生成的文本用于某个目的,例如映射中的键或添加到集合中,他们应该是三思而后行的人。然后,他们应该简单地调用 CharSequence::toString。API 的作者以后不必担心滥用。CharSequence