2015-04-18 14 views
5

Wenn mein Code sicher Map<String, String> zurückgibt, aber könnte leer sein. Gibt es einen Vorteil der Konvertierung in zurückzukehren. Wäre es sinnvoll, leere, aber nicht leere Instanzen zu nutzen?Was ist der wirkliche Vorteil der Rückgabe Optional <Map <String, String >> und nicht nur eine leere Map <String, String>

+3

Ich hatte kürzlich eine Diskussion darüber mit einem Kollegen. Es kommt auf eine Frage der Meinung, denke ich, abhängig davon, wie stark Sie an Javas "Optional" als Monade glauben. Pragmatisch bevorzuge ich die leere Karte. –

+1

Huh, ich würde mich schwer tun, den Wert eines 'Optional > persönlich zu sehen. Aber vielleicht könnte ich überzeugt sein. – yshavit

+4

Laut Brian Goetz sollten Sie es nicht mit Collections (und Maps) verwenden. Siehe: http://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555 – alfasin

Antwort

9

Wie so viele Fächer in der Computerprogrammierung, hängt es (tm).

Die Art, wie ich optional verwende, ist eine Alternative zu Null (kurz und bündig). Einer seiner advantages ist, dass es den Anrufer zu betrachten zwingt, dass es keinen Rückgabewert sein kann, und dass dies eine gültige Bedingung ist ... Betrachten Sie die Zitate aus den Antworten oben verlinkten:

Fehlen eines Wert ist eine präzisere Formulierung als null

und

Jeder Leser des Codes oder Verbraucher Ihrer API über werden geschlagen werden der Kopf mit der Tatsache, dass da vielleicht nichts da ist und dass vor dem Zugriff auf den Wert eine Überprüfung notwendig ist.

Also, wenn ich den Rückgabetyp Unterschrift Optional<Map<String, String>> sehen, ich denke, es als Rückgabetyp aus einer Funktion, wo eine leere Map könnte ein gültiger Rückgabewert sein, aber so ist eine vollständige Fehlen eines Map.

Beispiele hierfür sind getCachedFavoriteColors, findInvalidValuePairs usw. Im ersteren Fall kann es keine beliebige Benutzer sein, die eine leere Map zurückkehren würde - aber es könnte nicht ein Cache-Wert sein, der eine ungültige Optional zurückkehren . Im zweiten Fall gibt es möglicherweise keine ungültigen Wertepaare, die wiederum eine leere Map zurückgeben, aber möglicherweise auch keine Invalidator. Du hast die Idee.

Beachten Sie, dass Sie in einigen der obigen Fälle möglicherweise eine Ausnahme auslösen möchten, anstatt eine ungültige Optional zurückzugeben. Das ist Ihre Entscheidung als API-Designer.

+1

Aber eine Karte kann leer sein - jeder Benutzer einer Karte sollte das wissen, also Es ist gleichermaßen kopfüber geschlagen. Ich sehe den zusätzlichen Wert nicht. Tatsächlich haben Sie noch einen _anderen_ Status vom Typ "Dies ist leer" erstellt. Nun kann Ihre Referenz "abwesend()", von einer leeren Karte oder von einer nicht leeren Karte sein. Das deutet auf einen Unterschied zwischen den ersten beiden Zuständen hin, und es ist wahrscheinlich nicht allzu offensichtlich, was dieser Unterschied ist (selbst im Zusammenhang mit der API). – yshavit

+7

Aber (und natürlich muss diese Idee vernünftig auf das API-Design angewendet werden): * Abwesenheit von Elementen in einer Map * unterscheidet sich von * Abwesenheit der Map *. Letzteres ermöglicht optional, dass Sie es kurz und bündig ausdrücken können. – thirtythreeforty

+2

Es ist schwer sich daran zu erinnern, sowohl nach Null als auch nach leeren Karten zu suchen, oft werden die Leute vergessen und schließlich werden Laufzeitfehler geworfen. Mit einem Optional können Sie die Prüfungen für leere und leere aber initialisierte Strukturen in einer einzigen Prüfung zusammenfassen.Das ist, wofür ich sie benutze, und es macht definitiv die Fehlerprüfung viel einfacher. – egracer

Verwandte Themen