2011-12-06 31 views
8

我看不到String.indexOf接口CharSequence的任何缺點。好處是像StringBuffer或StringBuilder這樣的其他類也需要實現indexOf方法。爲什麼不是方法String.indexOf接口CharSequence的一部分?

那麼有什麼設計理由爲什麼indexOf只應該是String的一部分?

謝謝。

+0

所以你問的是:爲什麼'CharSequence'沒有'indexOf'方法? –

+1

StringBuffer和StringBuilder確實有indexOf方法,儘管... – Thilo

+0

@Thilo - 爲什麼不用CharSequence來指定這種行爲? (儘管java.nio.CharBuffer和javax.swing.text.Segment沒有實現'indexOf',他們很容易實現。) –

回答

7

我不確定這是什麼原因,但我可以舉一個類的例子來實現CharSequence。它是java.nio.CharBuffer

理論上可以通過循環調用charAt()來實現indexOf()。但它不會像用戶所期望的那樣工作。我們無法區分兩種情況:角色不在那裏,角色不在那裏,也不在那裏。在第二種情況下,indexOf()應按合同返回-1。在第一種情況下,它應該等到所有字節到達。但CharBuffer屬於非阻塞IO,所以它不能阻塞。

我相信這至少解釋了其中一個可能的原因。

編輯:

繼@Pacerier非常寶貴的意見我想補充以下內容。 恕我直言CharSequence作爲一個非常通用的接口,用於不同的情況。這個接口最知名的實現者是String,StringBufferStringBuilder,它們將整個內容保存在允許直接訪問任何字符的數據結構中。但一般情況下這是錯誤的。 java.nio.CharBuffer就是這種情況的一個例子。

+0

這就是把馬車放在馬前。你只是認爲CharBuffer不應該是一個CharSequence,而不是那個indexof不應該在CharSequence中。 – Pacerier

+1

@Pacerier,謝謝你的評論。請看看我的答案,除了希望馬前進。 :) – AlexR

+0

似乎應該有(但並不可悲)一個單獨的接口,它提供了String和StringBuilder實現的indexOf()方法,以便您可以傳入一個方法並輕鬆調用indexOf()off的。 –

3

我認爲這只是一個疏忽,因爲indexOf操作對任何順序都有意義。

2

Java 8可能會解決其中一些問題。它將允許接口上的默認實現。例如

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

這樣就可以將其他方法添加到接口中,而不會對所有實施者施加負擔來實現該方法。

+0

在AlexR在他的回答中提到的情況下,這對於例如'java.nio.CharBuffer'如何工作? indexOf()的默認實現不能解決他提到的問題。 – Jesper

+1

如果您在CharBuffer或StringBuilder或任何可變對象上使用方法,那麼您現在沒有返回代碼,但如果您更改了某些內容,則可能是true。如果你改變某些東西,例如數據,位置或限制發生了變化,它現在同樣可以是「真實的」,但是不真實。您只能根據現在的情況返回true/false。 –

相關問題