2011-12-06 12 views
8

Nie widzę żadnych wad w tworzeniu String.indexOf części interfejsu CharSequence. Korzyścią byłoby to, że inne klasy, takie jak StringBuffer lub StringBuilder, również musiałyby wdrożyć metody indexOf.Dlaczego metoda String.indexOf nie jest częścią interfejsu CharSequence?

Czy istnieje jakiś powód, dla którego indexOf powinien być tylko częścią String?

Dziękuję.

+0

Więc pytasz: Dlaczego 'CharSequence' nie ma metody' indexOf'? –

+1

StringBuffer i StringBuilder mają metody indexOf, choć ... – Thilo

+0

@Thilo - Który rodzaj błaga pytanie, dlaczego CharSequence nie określa tego zachowania? (I chociaż java.nio.CharBuffer i javax.swing.text.Segment nie implementują 'indexOf', to z łatwością mogłyby.) –

Odpowiedz

7

Nie jestem pewien, co jest tego przyczyną, ale mogę podać przykład klasy, która implementuje CharSequence. Jest to java.nio.CharBuffer.

Teoretycznie może zaimplementować indexOf(), wywołując w pętli charAt(). Ale nie będzie działać tak, jak tego oczekuje użytkownik. Nie możemy rozróżnić dwóch sytuacji: postać jeszcze nie istnieje, a postaci nie ma i nie będzie jej tam. W drugim przypadku indexOf() powinien zwrócić -1 na podstawie umowy. W pierwszym przypadku powinien poczekać, aż wszystkie bajty nadejdą. Ale CharBuffer należy do bez blokowania IO, więc nie można go zablokować.

Uważam, że wyjaśnia to przynajmniej jedną z możliwych przyczyn.

EDIT:

Po bardzo cenny komentarz przez @Pacerier chcę dodać, co następuje. IMHO CharSequence jako bardzo ogólny interfejs używany w różnych okolicznościach. Najbardziej znanymi implementatorami tego interfejsu są String, StringBuffer i StringBuilder, które przechowują całą zawartość w strukturze danych, która umożliwia bezpośredni dostęp do dowolnej postaci. Jest to jednak błędne w ogólnym przypadku. java.nio.CharBuffer jest przykładem takiego przypadku.

+0

To wkładanie wózka przed konia. Po prostu argumentowałeś, że CharBuffer nie powinien być CharSequence, a ten indeks nie powinien być w CharSequence. – Pacerier

+1

@Pacerier, dziękuję za komentarz. Proszę spojrzeć na dodatek do mojej odpowiedzi, że mam nadzieję, że poruszy konia do przodu. :) – AlexR

+0

Wygląda na to, że powinien istnieć (ale niestety nie jest) oddzielny interfejs, który zapewnia metody indexOf(), które zarówno String, jak i StringBuilder implementują, dzięki czemu można przekazać albo do metody i łatwo wywołać indexOf() off tego. –

3

Myślę, że to tylko niedopatrzenie, ponieważ operacja ma sens w przypadku dowolnej sekwencji.

2

Java 8 może rozwiązać niektóre z tych problemów. Pozwoli to na domyślne implementacje interfejsów. na przykład

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

Umożliwia to dodanie dodatkowych metod do interfejsów bez obciążania wszystkich implementatorów w celu wdrożenia tej metody.

+0

Jak by to działało na przykład 'java.nio.CharBuffer' w przypadku, który AlexR wspomina w swojej odpowiedzi? Domyślna implementacja 'indexOf()' nie rozwiązałaby problemu, o którym wspomniał. – Jesper

+1

Jeśli używasz metody na CharBuffer lub StringBuilder lub dowolnym zmiennym obiekcie, nie masz kodu powrotu dla jego 'false teraz, ale może być prawdą, jeśli coś zmienisz'. Równie dobrze może być "teraz prawda, ale fałsz, jeśli coś zmienisz", takie jak zmieniają się dane, pozycja lub limit. Możesz tylko zwrócić true/false w oparciu o to, co jest teraz. –