Mentre alcune persone potrebbero detestare i "metodi opzionali", in molti casi possono offrire una semantica migliore rispetto alle interfacce altamente segregate. Tra le altre cose, consentono le possibilità che un oggetto possa acquisire abilità o caratteristiche durante la sua vita, o che un oggetto (specialmente un oggetto wrapper) potrebbe non sapere quando è costruito quali abilità esatte dovrebbe riferire.
Mentre difficilmente chiamerò le classi di raccolta Java paragoni di buon design, suggerirei che un buon framework di raccolte dovrebbe includere alla sua base un gran numero di metodi opzionali insieme a modi di chiedere a una collezione le sue caratteristiche e abilità . Un tale design consentirà di utilizzare una singola classe wrapper con una grande varietà di collezioni senza oscurare accidentalmente le capacità che la collezione sottostante potrebbe possedere. Se i metodi non fossero facoltativi, sarebbe necessario disporre di una classe wrapper diversa per ogni combinazione di funzionalità che le raccolte potrebbero supportare, altrimenti alcune wrapper potrebbero essere inutilizzabili in alcune situazioni.
Ad esempio, se una raccolta supporta la scrittura di un elemento per indice o l'aggiunta di elementi alla fine, ma non supporta l'inserimento di elementi nel mezzo, il codice che desidera incapsularlo in un wrapper che registra tutte le azioni eseguite su di esso richiederebbe una versione del wrapper di logging che prevedeva la combinazione esatta di abilità supportate, o se nessuna fosse disponibile avrebbe dovuto usare un wrapper che supportava append o write-by-index ma non entrambi. Se, tuttavia, un'interfaccia di raccolta unificata forniva tutti e tre i metodi come "opzionali", ma includeva quindi metodi per indicare quale dei metodi opzionali sarebbe utilizzabile, una singola classe wrapper poteva gestire raccolte che implementano qualsiasi combinazione di caratteristiche. Quando viene chiesto quali funzioni supporta, un wrapper può semplicemente segnalare qualsiasi supporto della raccolta incapsulata.
Si noti che l'esistenza di "abilità opzionali" può in alcuni casi consentire alle raccolte aggregate di implementare determinate funzioni in modi molto più efficienti di quanto sarebbe possibile se le abilità fossero definite dall'esistenza di implementazioni. Ad esempio, supponiamo concatenate
che sia stato usato un metodo per formare una raccolta composita da altri due, il primo dei quali era una ArrayList con 1.000.000 di elementi e l'ultimo dei quali era una raccolta di venti elementi che poteva essere ripetuta dall'inizio. Se fosse richiesta la raccolta composita per il 1.000.013 ° elemento (indice 1.000.012), si potrebbe chiedere all'ArrayList quanti elementi conteneva (cioè 1.000.000), sottrarre quello dall'indice richiesto (producendo 12), leggere e saltare dodici elementi dal secondo raccolta e quindi restituisce l'elemento successivo.
In una situazione del genere, anche se la raccolta composita non avrebbe un modo istantaneo di restituire un articolo per indice, chiedere alla raccolta composita per il 1.000.013 ° articolo sarebbe comunque molto più veloce che leggere 1.000.013 articoli da esso singolarmente e ignorare tutto tranne l'ultimo uno.