Java 在API的CharSequence和String之间进行选择
。Java库中的许多方法都接受Java 在API的CharSequence和String之间进行选择,java,string,charsequence,Java,String,Charsequence,。Java库中的许多方法都接受CharSequenceso。一些类具有String方法(例如,Writer.write(String)),并且还使用等效的CharSequence方法(例如,Writer.append(CharSequence))实现了appendeable) 如果我正在编写一个委托给此类类的类,并且需要一些文本输入,我可以选择将该输入作为字符串或字符序列。选择后者,通过为客户机提供更多选项,使类更加灵活。但我没有看到太多这样的代码:文本参数几乎总是字符串,而不是字符序列。使用C
CharSequence
so。一些类具有String
方法(例如,Writer.write(String)
),并且还使用等效的CharSequence
方法(例如,Writer.append(CharSequence)
)实现了appendeable
)
如果我正在编写一个委托给此类类的类,并且需要一些文本输入,我可以选择将该输入作为字符串
或字符序列
。选择后者,通过为客户机提供更多选项,使类更加灵活。但我没有看到太多这样的代码:文本参数几乎总是字符串
,而不是字符序列
。使用CharSequence
有缺点吗?有演出热播吗?或者仅仅是程序员的交互作用或无知导致使用String
而不是CharSequence
比较
class XMLWriter {
private final Writer writer;
// more stuff here
public void writeComment(String text) {
writer.write("<!-- ");
writer.write(text);
writer.write(" -->");
}
}
classxmlwriter{
私人最终撰稿人;
//这里有更多的东西
public void writeComment(字符串文本){
作者:写(“”);
}
}
与
classxmlwriter{
私人最终撰稿人;
//这里有更多的东西
public void writeComment(字符序列文本){
作者:写(“”);
}
}
引用Javadoc:
此接口不会细化和方法的常规契约。因此,测试实现CharSequence
的两个对象是否相等的结果通常是未定义的。每个对象可以由不同的类实现,并且不能保证每个类都能够测试其实例是否与其他类的实例相等。因此,将任意CharSequence
实例用作集合中的元素或映射中的键是不合适的
因此,在使用charsequence替换字符串之前,我们必须三思而后行。您的逻辑对我很有意义。通过使用CharSequence,您可以允许调用代码提供StringBuffer/StringBuilder,而无需对其调用toString(),这种情况经常发生。@Andy是的,我在编写问题时考虑了
StringBuilder
。请参阅此问题稍后的副本。有关更多讨论,请参阅java中的问题及其副本。和。作为较新问题的重复关闭,因为该问题吸引了一些彻底的答案。您认为仅输出文本的方法,例如我的示例,应该使用CharSequence
,而不是String
?回答得好,感谢引用Javadoc。但我不同意你的结论。使用某些API返回的CharSequence
的问题属于调用API的程序员,而不是API的作者。如果调用程序的程序员将生成的文本用于某个目的,例如地图中的一个键或添加到集合中,那么他们应该是需要三思而后行的人。然后他们应该直接打电话。API的作者不应该担心以后的误用。
class XMLWriter {
private final Writer writer;
// more stuff here
public void writeComment(CharSequence text) {
writer.write("<!-- ");
writer.append(text);
writer.write(" -->");
}
}