Perché la definizione di CharSequence non contiene (CharSequence)?

10

Questo vale sia per Java SE che per amp; Android, poiché i contratti sono identici.

CharSequence non definisce un metodo contains(CharSequence) . Non riesco a trovare una ragione per cui, includendo, sarebbe abbastanza utile, evitando la necessità di chiamare CharSequence#toString() per verificare una sequenza di caratteri.

Ad esempio, in Android, gli utenti sono costretti a chiamare Editable#toString() per vedere se contiene una sequenza di caratteri, anche se Editable implementa CharSequence , che può essere evitato se CharSequence definito contains(CharSequence) .

Qual è l'idea alla base di questa scelta di design? Si tratta di una potenziale svista o esiste una ragione di progettazione per questo?

    
posta Vince Emigh 22.10.2017 - 00:39
fonte

1 risposta

8

Il punto di CharSequence è di fornire una vista di sola lettura a una sequenza di caratteri, e il gioco è fatto. Questa interfaccia non fornisce metodi di manipolazione delle stringhe o di ricerca. Quelli sono fuori portata.

Il principio di segregazione dell'interfaccia suggerisce che i client di un tipo non dovrebbero dipendere da metodi che non usano. Pertanto, un'interfaccia dovrebbe dichiarare solo il set minimo utile. Se un caso d'uso diverso richiede metodi diversi, dovrebbe esserci un'interfaccia diversa.

Un cliente che ha bisogno solo di una fonte di caratteri probabilmente non ha bisogno di metodi di ricerca.

Ovviamente è possibile esagerare con questo Principio e finire con mille piccole interfacce. Anche questo non va bene. Pertanto l'interfaccia CharSequence non contiene solo i metodi% charAt() e length() , ma anche il metodo di convenienza profondamente correlato subSequence() . (Un CharSequence può probabilmente fornire una vista su una sottosequenza senza una copia di stringa, motivo per cui questo dovrebbe essere un metodo di istanza). Specificare toString() è OK perché quel metodo sarebbe comunque ereditato da Object . I metodi chars() e codePoints() adattano un CharSequence a un'interfaccia Stream . Poiché si tratta di metodi predefiniti, non impongono requisiti aggiuntivi per le classi che implementano CharSequence .

Il tipo CharSequence è utile quando un metodo richiede un'origine di carattere generica senza specificare un'implementazione particolare (ad esempio, String vs. CharBuffer e StringBuilder). I metodi String#join() e String#contains() sono buoni esempi di utilizzo di CharSequence s.

Non è necessario che CharSequence fornisca un metodo contains() perché può essere implementato esternamente. Mentre Java non ha la comodità dei metodi di estensione di C #, un metodo statico è essenzialmente la stessa cosa. Quindi invece di boolean Editable#contains(CharSequence needle) avresti un static boolean contains(CharSequence haystack, CharSequence needle) . Gli algoritmi di ricerca delle stringhe sono un argomento informatico ben studiato. Diversi algoritmi con diversi compromessi sono facilmente disponibili.

Ulteriori letture:

risposta data 22.10.2017 - 17:50
fonte

Leggi altre domande sui tag