Perché CharSequence non contiene (CharSequence)?


11

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

CharSequencenon definisce un contains(CharSequence)metodo. Non riesco a trovare un motivo per cui, e includerlo sarebbe abbastanza utile, evitando la necessità di chiamare CharSequence#toString()per verificare la presenza di 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 Editableimplementati CharSequence, che possono essere evitati se CharSequencedefiniti contains(CharSequence).

Qual è l'idea alla base di questa scelta progettuale? È una potenziale supervisione o c'è una ragione progettuale per questo?

Risposte:


10

Il punto CharSequenceè fornire una vista di sola lettura a una sequenza di caratteri, e basta. Questa interfaccia non fornisce alcuna manipolazione di stringhe o metodi 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 client che necessita 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. Neanche questo va bene. Quindi l' CharSequenceinterfaccia non contiene solo il minimo charAt()e i length()metodi, ma anche il metodo di convenienza profondamente correlato subSequence(). (Una 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 ereditato comunque Object. I metodi chars()e l' codePoints()adattamento CharSequencea a Streamun'interfaccia. Poiché si tratta di metodi predefiniti, non impongono requisiti aggiuntivi per l'implementazione delle classi CharSequence.

Il CharSequencetipo è utile quando un metodo necessita di un'origine carattere generica senza specificare un'implementazione particolare (ad esempio String vs. CharBuffer vs. StringBuilder). I metodi String#join()e String#contains()sono buoni esempi dell'uso di CharSequences.

Non è necessario CharSequencefornire un contains()metodo 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)te avresti a static boolean contains(CharSequence haystack, CharSequence needle). Gli algoritmi di ricerca di stringhe sono un argomento di informatica ben studiato. Sono immediatamente disponibili algoritmi diversi con diversi compromessi.

Ulteriori letture:


2
Lei parla di " Questa interfaccia non fornisce alcuna manipolazione di stringhe o di metodi di ricerca. Questi sono fuori portata. ", Ma containsnon è un metodo di mutazione, e ci fa metodi esistono Ricerca ( charAt), in modo da come si applica questo ?. Inoltre, " Poiché si tratta di metodi predefiniti, non impongono requisiti aggiuntivi per le classi che implementano CharSequence. " - Impossibile containsimplementare come predefinito tramite impl return to String().contains(...), rimuovendo il requisito da implementare per le classi?
Vince Emigh,

1
@VinceEmigh Sì, contains()potrebbe essere un metodo predefinito. Se esistesse, non dovrebbe essere implementato in termini String#containsma al contrario: String dovrebbe usare l'implementazione di CharSequence. Il charAt()è diverso. Non implementa un algoritmo di ricerca, è una parte cruciale del CharSequence: senza di esso, i contenuti non potrebbero essere copiati in un tipo diverso come String. Gli stream sono una parte cruciale di Java8 e l'aggiunta di questi metodi predefiniti è in linea con le aggiunte ad altre interfacce come Collection.
amon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.