我看不到String.indexOf
接口CharSequence
的任何缺點。好處是像StringBuffer或StringBuilder這樣的其他類也需要實現indexOf方法。爲什麼不是方法String.indexOf接口CharSequence的一部分?
那麼有什麼設計理由爲什麼indexOf
只應該是String
的一部分?
謝謝。
我看不到String.indexOf
接口CharSequence
的任何缺點。好處是像StringBuffer或StringBuilder這樣的其他類也需要實現indexOf方法。爲什麼不是方法String.indexOf接口CharSequence的一部分?
那麼有什麼設計理由爲什麼indexOf
只應該是String
的一部分?
謝謝。
我不確定這是什麼原因,但我可以舉一個類的例子來實現CharSequence
。它是java.nio.CharBuffer
。
理論上可以通過循環調用charAt()
來實現indexOf()
。但它不會像用戶所期望的那樣工作。我們無法區分兩種情況:角色不在那裏,角色不在那裏,也不在那裏。在第二種情況下,indexOf()
應按合同返回-1。在第一種情況下,它應該等到所有字節到達。但CharBuffer屬於非阻塞IO,所以它不能阻塞。
我相信這至少解釋了其中一個可能的原因。
編輯:
繼@Pacerier非常寶貴的意見我想補充以下內容。 恕我直言CharSequence
作爲一個非常通用的接口,用於不同的情況。這個接口最知名的實現者是String
,StringBuffer
和StringBuilder
,它們將整個內容保存在允許直接訪問任何字符的數據結構中。但一般情況下這是錯誤的。 java.nio.CharBuffer
就是這種情況的一個例子。
我認爲這只是一個疏忽,因爲indexOf
操作對任何順序都有意義。
Java 8可能會解決其中一些問題。它將允許接口上的默認實現。例如
interface List {
void sort() default Collections.sort(this);
}
這樣就可以將其他方法添加到接口中,而不會對所有實施者施加負擔來實現該方法。
在AlexR在他的回答中提到的情況下,這對於例如'java.nio.CharBuffer'如何工作? indexOf()的默認實現不能解決他提到的問題。 – Jesper
如果您在CharBuffer或StringBuilder或任何可變對象上使用方法,那麼您現在沒有返回代碼,但如果您更改了某些內容,則可能是true。如果你改變某些東西,例如數據,位置或限制發生了變化,它現在同樣可以是「真實的」,但是不真實。您只能根據現在的情況返回true/false。 –
所以你問的是:爲什麼'CharSequence'沒有'indexOf'方法? –
StringBuffer和StringBuilder確實有indexOf方法,儘管... – Thilo
@Thilo - 爲什麼不用CharSequence來指定這種行爲? (儘管java.nio.CharBuffer和javax.swing.text.Segment沒有實現'indexOf',他們很容易實現。) –