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: