【问题标题】:Why isn't method String.indexOf part of interface CharSequence?为什么方法 String.indexOf 不是接口 CharSequence 的一部分?
【发布时间】:2011-12-06 06:33:46
【问题描述】:

我看不出将String.indexOf 作为接口CharSequence 的一部分有任何缺点。好处是其他类如 StringBuffer 或 StringBuilder 也需要实现 indexOf 方法。

那么indexOf 应该只是String 的一部分有什么设计原因吗?

谢谢。

【问题讨论】:

  • 那么你要问的是:为什么CharSequence 没有indexOf 方法?
  • StringBuffer 和 StringBuilder 确实有 indexOf 方法,不过...
  • @Thilo - 哪种引出了为什么 CharSequence 不指定该行为的问题? (虽然 java.nio.CharBuffer 和 javax.swing.text.Segment 没有实现 indexOf,但它们很容易实现。)
  • 为什么StringBuilder没有contains?我想只有 API 设计人员才能回答这类问题(不过,不能投票关闭,因为这可能已经在某些邮件列表中讨论过,而且有人可能知道)。
  • @Shakedown 是的,这是我的问题,因为indexOf 适合当前实现CharSequence 的每个类。

标签: java string indexof charsequence


【解决方案1】:

我不确定这是什么原因,但我可以举一个实现CharSequence 的类的示例。它是java.nio.CharBuffer

理论上它可以通过在循环中调用charAt()来实现indexOf()。但它不会像用户期望的那样工作。我们无法区分两种情况:角色尚不存在,角色不存在且不会存在。在第二种情况下,indexOf() 应该按合同返回 -1。在第一种情况下,它应该等到所有字节都到达。但是CharBuffer属于非阻塞IO,所以不能阻塞。

我相信这至少解释了其中一个可能的原因。

编辑:

在@Pacerier 发表非常有价值的评论之后,我想添加以下内容。 恕我直言CharSequence 作为一个非常通用的接口,用于不同的情况。该接口最著名的实现者是StringStringBufferStringBuilder,它们将整个内容保存在允许直接访问任何字符的数据结构中。但是在一般情况下这是错误的。 java.nio.CharBuffer 就是这种情况的一个例子。

【讨论】:

  • 这是本末倒置。您只是争辩说 CharBuffer 不应该是 CharSequence,而不是 indexof 不应该在 CharSequence 中。
  • @Pacerier,感谢您的评论。请看一下我的回答,希望能推动马前进。 :)
  • 似乎应该有(但遗憾的是没有)一个单独的接口,提供 String 和 StringBuilder 都实现的 indexOf() 方法,以便您可以轻松地将任何一个传递给方法调用 indexOf() 关闭它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Java 8 可能会解决其中的一些问题。它将允许接口上的默认实现。例如

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

    这允许向接口添加额外的方法,而不会给所有实现者带来负担来实现该方法。

    【讨论】:

    • 在 AlexR 在他的回答中提到的情况下,例如 java.nio.CharBuffer 这将如何工作? indexOf() 的默认实现不能解决他提到的问题。
    • 如果您在 CharBuffer 或 StringBuilder 或任何可变对象上使用方法,您没有其false now but might be true if you change something 的返回码。也可以是true now but false if you change something,例如数据、位置或限制发生变化。您只能根据现在的情况返回真/假。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多