Optional wurde als Rückgabetyp für Methoden entworfen, die legitim kein Ergebnis haben können, damit der Aufrufer die Abwesenheit nicht ignorieren kann. Für Felder, Konstruktorparameter und Methodenargumente passt es schlecht, und es sollte keine Collection umhüllen, denn eine leere Liste sagt bereits, dass da nichts ist. get ohne Prüfung aufzurufen macht den Sinn kaputt; nimm map, filter, orElseGet oder orElseThrow mit einer aussagekräftigen Exception.
Warum Interviewer das fragen
Das ist eine kleine API-Design-Frage, die zeigt, wie du über Nullbarkeit und Lesbarkeit denkst. Der Interviewer will sehen, dass du weißt, wofür es existiert, dass es nicht serialisierbar ist und deshalb nichts in Entities oder DTO-Feldern zu suchen hat, und dass die Verkettung den eigentlichen Wert ausmacht. Antworten, die es als Wrapper um einen Null-Check behandeln, bringen meist Code mit, der schwerer zu lesen ist als das null vorher.
So baust du deine Antwort auf
- Nenn den vorgesehenen Einsatz: ein Rückgabetyp, der mögliche Abwesenheit ausdrückt.
- Zähl die Stellen auf, an denen es nichts zu suchen hat, und warum.
- Zeig den Verkettungsstil statt isPresent und get.
- Erwähne die Regel zur leeren Collection.
Beispielantwort
Es existiert, damit eine Methodensignatur sagen kann, hier kommt vielleicht nichts zurück, was ein nullbarer Rückgabetyp nie kommuniziert hat. Repository-artige Lookups geben also ein Optional zurück und der Aufrufer muss sich damit auseinandersetzen. Schiefgehen tut es, wenn Leute es überall hinpacken. Als Feld kostet es ein Objekt pro Instanz und ist nicht serialisierbar, was in Entities und Payloads echte Probleme macht. Als Parameter gibt es Aufrufern nur drei Zustände zum Nachdenken statt zwei, dafür nehme ich lieber eine Überladung. Und eine Methode, die eine Collection liefert, gibt eine leere Collection zurück, niemals ein Optional einer Liste, denn leer bedeutet bereits dasselbe. Stilistisch gilt: schreibe ich isPresent gefolgt von get, habe ich gerade einen Null-Check mit Extra-Zeremonie geschrieben, also verkette ich stattdessen: map auf das, was ich will, filter, dann orElseThrow mit einer Domain-Exception, die sagt, welche id nicht gefunden wurde. Was ich nicht tun würde, ist es als generellen Null-Ersatz quer durch eine bestehende Codebase zu ziehen, denn der Mischstil ist schlimmer als jede der beiden Konventionen allein.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Was ist der Unterschied zwischen orElse und orElseGet?
- Wie würdest du mit einem nullbaren Feld aus einer externen API umgehen?
- Wie spielt Optional mit Streams zusammen?
Weitere Fragen für Java-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen