Metodo che restituisce un elenco non modificabile

4

In Java puoi restituire un elenco che non può essere modificato dal chiamante facendo return Collections.unmodifiableList(list) .

Il nome del metodo dovrebbe indicare che sta restituendo un elenco non modificabile? Ciò potrebbe impedire ai client della mia classe di tentare di aggiungere o rimuovere oggetti dall'elenco.

    
posta user4205580 15.04.2016 - 12:28
fonte

4 risposte

4

Non sapendo che il metodo restituisce semplicemente un List , la mia prima reazione è stata questa:

No, the method name should reflect what the method does in terms of the problem domain. Nowadays, I can see no reason for adding type information to method (or object) names. The return type should be easily displayed by any decent IDE.

This might have been different way back when people mostly read code in a simple text editor or printed out on paper. In these times, naming conventions like Hungarian Notation actually made sense.

This also applies to the name of the returned object in the calling function.

Ora, dopo aver appreso cosa fa effettivamente Collections.unmodifiableList(list) , devo dire, sì, renderlo veramente ovvio nel nome del metodo e nel nome dell'oggetto.

Ma soprattutto, proverei a evitare di usare questo metodo. Considererei molto pericoloso il fatto che il controllo venga eseguito solo in fase di esecuzione.

    
risposta data 15.04.2016 - 12:54
fonte
4

Il metodo unmodifiableList() dovrebbe aver restituito un nuovo tipo che rende ovvio che non è modificabile. Vedi questa domanda per una discussione sul motivo per cui ciò non è stato fatto.

Così com'è, devi chiarire questa limitazione. Di solito dovrebbe essere sufficiente menzionarlo nella documentazione API del metodo, in particolare se è ovvio dal dominio che l'inserimento o l'eliminazione non può funzionare (nessuno si aspetta di essere in grado di trovare un nuovo paese nel mondo solo perché findCountries() tecnicamente restituisce un oggetto con un metodo add() ).

Se il tuo dominio non è così chiaro, può essere una buona idea per rendere ancora più chiara la limitazione tramite il nome del metodo. Ad esempio, se hai un metodo supportedFlavors() , non sarebbe del tutto irragionevole credere che puoi modificare i sapori supportati manipolando l'elenco e aggiungere un avvertimento tramite il nome potrebbe essere un'idea migliore.

    
risposta data 15.04.2016 - 12:35
fonte
2

A volte lo documento restituendo Collection<? extends ElementType> anziché Collection<ElementType> . In questo modo l'aggiunta di elementi è chiaramente non supportata. E rimuovere l'essere non supportato è quindi implicito. Potresti renderlo più esplicito se

  • è un'API pubblica
  • source non è prontamente disponibile per i client dell'interfaccia
  • il dominio non è ovvio
risposta data 15.04.2016 - 12:52
fonte
2

Hai scritto:

Should the method name indicate that it's returning an unmodifiable list? That could prevent clients of my class from attempting to add or remove objects from the list.

No. La tua interfaccia deve far rispettare la natura di sola lettura (e, a parte, devi decidere se l'oggetto restituito è immutabile, o se può cambiare mentre i tuoi clienti lo stanno ispezionando o trattenendo. copia difensiva un obiettivo valido qui?).

    
risposta data 15.04.2016 - 16:48
fonte

Leggi altre domande sui tag