2015-04-18 12 views
5

Se il mio codice restituisce sicuramente Map<String, String>, ma potrebbe essere vuoto. C'è un vantaggio di convertirlo per restituire Optional<Map<String, String>>. Potrebbe aggiungere qualche vantaggio alle istanze vuote ma non nulle?Qual è il vero vantaggio del reso facoltativo <Map <String, String >> piuttosto che solo una <String, String> vuota

+3

Recentemente ho avuto una discussione su questo con un collega. Dipende da una questione di opinioni, penso, a seconda di quanto fortemente credi in 'Opzionale 'di Java come una monade. Pragmaticamente, preferisco la mappa vuota. –

+1

Huh, sarei in difficoltà a vedere il valore di un 'Optional >', personalmente. Ma forse potrei essere convinto. – yshavit

+4

Secondo Brian Goetz non dovresti usarlo con Collections (e Maps pure). Vedi: http://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555 – alfasin

risposta

9

Come tanti soggetti nella programmazione per computer, dipende (tm).

Il modo in cui utilizzo facoltativo è in alternativa a null (in poche parole). Uno dei suoi advantages è che costringe il visitatore a considerare che non ci può essere un valore restituito, e che questa è una condizione valida ... Considerate le citazioni dalle risposte legate sopra:

assenza di un valore è una formulazione più precisa rispetto nullo

e

Ogni lettore di codice o consumatore del API sarà battuto sopra la testa con il fatto che potrebbe non esserci nulla e che è necessario un controllo prima di accedere al valore.

Così, quando vedo il tipo restituito firma Optional<Map<String, String>>, penso che sia un tipo di ritorno da una funzione in cui un vuoto Map potrebbe essere un valore di ritorno valida, ma lo è anche tutta una mancanza di un Map.

Esempi di questo includono getCachedFavoriteColors, findInvalidValuePairs, etc. Nel primo caso, potrebbe non esserci alcuna tutti gli utenti, che restituiscono un vuoto Map - ma potrebbe non essere un valore di cache, che restituisce un valido Optional . Nel secondo caso, potrebbero non esserci coppie di valori non valide, che restituirebbero nuovamente un valore vuoto Map, ma potrebbe anche non esserci un Invalidator. Hai un'idea.

Si noti che in alcuni dei casi precedenti è possibile che si desideri generare un'eccezione anziché restituire un valore non valido Optional. Questa è la tua decisione come designer di API.

+1

Ma una mappa può essere vuota - qualsiasi utente di una mappa dovrebbe saperlo, quindi è ugualmente battuto dalla testa. Non vedo il valore aggiuntivo. In effetti, hai creato ancora _another_ "questo è vuoto" -tipo di stato. Ora il tuo riferimento può essere 'absent()', di una mappa vuota o di una mappa non vuota. Ciò suggerisce alcune differenze tra i primi due stati, e probabilmente non è troppo ovvio quale sia questa differenza (anche nel contesto dell'API). – yshavit

+7

Ma (e ovviamente questa idea deve essere applicata con giudizio alla progettazione dell'API): * l'assenza di elementi in una mappa * è distinta da * assenza della mappa *. È quest'ultimo che Optional ti consente di esprimere in modo conciso. – thirtythreeforty

+2

È difficile ricordare di controllare sia le mappe nulle che quelle vuote, spesso le persone dimenticheranno e alla fine verranno lanciati gli errori di runtime. Con un Facoltativo, è possibile condensare i controlli per le strutture nulle e vuote ma inizializzate in un unico controllo.Questo è quello che uso per loro, e sicuramente rende molto più facile il controllo degli errori. – egracer

Problemi correlati