为什么String.indexOf方法不是CharSequence接口的一部分?

9
我认为将 String.indexOf 加入接口CharSequence中没有任何缺点。这样做的好处是其他类(如StringBuffer或StringBuilder)也需要实现indexOf方法。
那么,是否有设计原因使得 indexOf 只属于 String 呢?
谢谢。

所以你的问题是:为什么CharSequence没有一个indexOf方法? - Nate W.
1
StringBuffer和StringBuilder确实有indexOf方法... - Thilo
@Thilo - 这也引出了一个问题,为什么CharSequence没有指定这种行为呢?(虽然java.nio.CharBuffer和javax.swing.text.Segment没有实现“indexOf”,但它们很容易实现。) - Ted Hopp
为什么StringBuilder没有contains方法呢?我猜只有API设计人员才能回答这种问题(虽然不投票关闭,因为可能已经在某个邮件列表上讨论过,并且可能有人知道)。 - Thilo
@Shakedown 是的,这就是我的问题,因为 indexOf 适用于当前实现了 CharSequence 的每个类。 - halex
3个回答

8
我不确定原因,但我可以举一个实现CharSequence接口的类的例子,那就是java.nio.CharBuffer。从理论上讲,它可以通过循环调用charAt()来实现indexOf(),但这不会按照用户期望的工作。我们无法区分两种情况:字符尚未到达和字符不会到达。在第二种情况下,根据契约,indexOf()应返回-1。在第一种情况下,它应等待所有字节到达。但CharBuffer属于非阻塞IO,因此它不能阻塞。我认为这解释了至少一个可能的原因。
编辑:
根据@Pacerier非常有价值的评论,我想补充一下。我认为CharSequence是一个非常通用的接口,在不同的情况下使用。其最知名的实现者是String、StringBuffer和StringBuilder,它们都将整个内容保存在数据结构中,并允许直接访问任何字符。然而,在一般情况下这是错误的,java.nio.CharBuffer就是这种情况的一个例子。

这是本末倒置了。你只是争辩CharBuffer不应该是一个CharSequence,而不是indexof不应该在CharSequence中。 - Pacerier
1
@Pacerier,感谢您的评论。请看一下我回答中的补充内容,希望能推动进展。 :) - AlexR
看起来应该有一个单独的接口提供indexOf()方法,String和StringBuilder都实现了它,这样你就可以将任意一个传递到一个方法中,并轻松地调用indexOf()。但可惜的是,目前并没有这样的接口。 - James Dunn

3

我认为这只是一个疏忽,因为indexOf操作对于任何类型的序列都有意义。


2

Java 8可能会解决一些问题。它将允许在接口上进行默认实现。例如:

interface List {
    void sort() default Collections.sort(this);
}

这样做可以在不给所有实现者增加负担的情况下,向接口添加额外的方法。

如果以AlexR在他的回答中提到的java.nio.CharBuffer为例,这将如何工作? indexOf()的默认实现无法解决他提到的问题。 - Jesper
1
如果您在CharBuffer或StringBuilder或任何可变对象上使用方法,则没有返回代码以表示其“现在为false但如果您更改某些内容可能为true”。它同样可以是“现在为true但如果您更改数据、位置或限制则为false”。您只能根据当前情况返回true/false。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接