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
risposta
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.
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
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
È 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
- 1. Impossibile trasmettere HashMap <String, String> a un'interfaccia che estende Map <String, String>
- 2. Come eseguire il cast List <Map<?, ?>> in List <Map <String, String >>?
- 3. ArrayList <HashMap <String, String >> per String []
- 4. convertire EnumerableRowCollection <string> la lista <string>
- 5. Perché java.util.Properties implementa Map <Object, Object> e non Map <String, String>
- 6. Come iterare Arraylist <HashMap <String, String >>?
- 7. Get ArrayList <HashMap <String, String >> valori
- 8. NameValueCollection vs Dictionary <string, string>
- 9. Perché map <string, string> accetta valori come input?
- 10. C# Converti lista <string> nel dizionario <string, string>
- 11. Contenitore string migliore: StringCollection, Collezione <string>, Lista <string>, ArrayList, ..?
- 12. java.util.Properties Vs java.util.Map <String, String>
- 13. Mappatura JPA <String, String> mapping
- 14. IDictionary <string, string> o NameValueCollection
- 15. StringDictionary vs Dictionary <string, string>
- 16. Qual è la differenza tra l'elenco <string> e IEnumerable <String>?
- 17. Converti Set <String>
- 18. LINQ - trasformare Lista <string> in Dictionary <string, string>
- 19. Alla ricerca di un alterantive alla lista <KeyValuePair <string, KeyValuePair <string, string >>>
- 20. Come convertire Dictionary <string, object> dizionario <string, string> in C#
- 21. JAXB/XJC genera JAXBElement <String> piuttosto che solo String (per gestire caso null)
- 22. Devo cancellare il vettore <string>?
- 23. Conversione dall'opzione <&str> all'opzione <String>
- 24. C++ mappa <string, vettore <char>> accesso
- 25. Java Generics che inserisce sulla mappa <String,? estende la lista <String>>
- 26. Unisci Map <String, Lista <String> Java 8 Streaming
- 27. Vantaggi della conversione dell'elenco <String> in HashSet <String> Java
- 28. Come passare una mappa <String, String> con application.properties
- 29. Che cos'è l'azione <string>?
- 30. convert <vector><string> TO <vector><int> C++, Win32
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. –
Huh, sarei in difficoltà a vedere il valore di un 'Optional
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