2011-12-06 11 views
8

Non riesco a vedere alcun inconveniente nel rendere String.indexOf parte dell'interfaccia CharSequence. Il vantaggio sarebbe che altre classi come StringBuffer o StringBuilder avrebbero bisogno di implementare anche i metodi indexOf.Perché il metodo String.indexOf non è parte dell'interfaccia CharSequence?

Quindi c'è qualche motivo per cui lo indexOf dovrebbe essere parte di String?

Grazie.

+0

Quindi, quello che stai chiedendo è: perché 'CharSequence' non ha un metodo' indexOf'? –

+1

StringBuffer e StringBuilder hanno metodi indexOf, anche se ... – Thilo

+0

@Thilo - Qual è il tipo di domande del perché CharSequence non specifica questo comportamento? (E sebbene java.nio.CharBuffer e javax.swing.text.Segment non implementino 'indexOf', potrebbero facilmente.) –

risposta

7

Non sono sicuro di quale sia la ragione, ma posso fornire un esempio di classe che implementa CharSequence. È java.nio.CharBuffer.

In teoria è possibile implementare indexOf() chiamando in ciclo charAt(). Ma non funzionerà come l'utente si aspetta. Non possiamo distinguere tra 2 situazioni: il personaggio non c'è ancora e il personaggio non è lì e non ci sarà. Nel secondo caso, indexOf() dovrebbe restituire -1 per contratto. Nel primo caso dovrebbe attendere fino all'arrivo di tutti i byte. Ma CharBuffer appartiene a non bloccante IO, quindi non può bloccare.

Credo che questo spieghi almeno uno dei possibili motivi.

EDIT:

seguito molto prezioso commento di @Pacerier voglio aggiungere quanto segue. IMHO CharSequence come interfaccia molto generica che viene utilizzata in diverse circostanze. I più noti implementatori di questa interfaccia sono String, StringBuffer e StringBuilder che detengono l'intero contenuto nella struttura dati che consente l'accesso diretto a qualsiasi carattere. Questo è comunque sbagliato nel caso generale. java.nio.CharBuffer è un esempio di tale caso.

+0

Questo sta mettendo il carro davanti ai buoi. Hai semplicemente sostenuto che CharBuffer non dovrebbe essere un CharSequence, e non che indexof non dovrebbe essere in CharSequence. – Pacerier

+1

@Pacerier, grazie per il tuo commento. Si prega di dare un'occhiata oltre alla mia risposta che, si spera, spinge il cavallo in avanti. :) – AlexR

+0

Sembra che ci dovrebbe essere (ma non c'è purtroppo) un'interfaccia separata che fornisce metodi indexOf() implementati sia da String che da StringBuilder, in modo che sia possibile passare a un metodo e chiamare facilmente indexOf() di esso. –

3

Penso che sia solo una svista, poiché l'operazione indexOf ha senso per qualsiasi tipo di sequenza.

2

Java 8 può risolvere alcuni di questi problemi. Permetterà implementazioni predefinite su interfacce. per esempio.

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

Ciò consente di aggiungere ulteriori metodi alle interfacce senza gravare su tutti gli implementatori per implementare tale metodo.

+0

Come funzionerebbe, ad esempio, per 'java.nio.CharBuffer' nel caso in cui AlexR menzioni nella sua risposta? Un'implementazione predefinita di 'indexOf()' non risolverebbe il problema che menziona. – Jesper

+1

Se si utilizza un metodo su CharBuffer o StringBuilder o su qualsiasi oggetto mutabile, non si dispone di un codice di ritorno per il suo 'false ora, ma potrebbe essere vero se si cambia qualcosa. Potrebbe anche essere "vero ora, ma falso se si modifica qualcosa", come i dati, la posizione o il limite è cambiato. Puoi solo restituire vero/falso in base a ciò che è presente ora. –

Problemi correlati