{"id":392,"date":"2024-05-15T09:52:52","date_gmt":"2024-05-15T08:52:52","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=392"},"modified":"2024-06-07T09:55:11","modified_gmt":"2024-06-07T08:55:11","slug":"optionals-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=392","title":{"rendered":"Optionals in Java"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Einf\u00fchrung<\/h4>\n\n\n\n<p>In der Programmierung treten h\u00e4ufig Situationen auf, in denen eine Variable m\u00f6glicherweise keinen Wert besitzt, was in vielen Sprachen durch <code>null<\/code> dargestellt wird. In Java kann dies zu <code>NullPointerException<\/code> f\u00fchren, einer der h\u00e4ufigsten Fehlerquellen. Um diesem Problem entgegenzuwirken, wurde mit Java 8 die Klasse <code>Optional<\/code> eingef\u00fchrt. <code>Optional<\/code> ist ein Container-Objekt, das entweder einen Wert enth\u00e4lt oder leer ist. Diese Klasse bietet eine elegante M\u00f6glichkeit, mit potenziell fehlenden Werten umzugehen und den Code sicherer und lesbarer zu gestalten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Was ist <code>Optional<\/code>?<\/h4>\n\n\n\n<p><code>Optional<\/code> ist eine generische Klasse, die im Paket <code>java.util<\/code> enthalten ist. Sie dient dazu, null-basierte Fehler zu vermeiden und explizit anzugeben, dass eine Variable leer sein kann. Anstatt mit <code>null<\/code> zu arbeiten, kann ein <code>Optional<\/code> verwendet werden, um die M\u00f6glichkeit eines fehlenden Wertes zu signalisieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Optional&lt;<span class=\"hljs-built_in\">String<\/span>&gt; optionalString = Optional.of(<span class=\"hljs-string\">\"Hello, World!\"<\/span>);\nOptional&lt;<span class=\"hljs-built_in\">String<\/span>&gt; emptyOptional = Optional.empty();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Erstellung von <code>Optional<\/code>-Objekten<\/h4>\n\n\n\n<p>Es gibt mehrere M\u00f6glichkeiten, <code>Optional<\/code>-Objekte zu erstellen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>Optional.of(T value)<\/code><\/strong>: Erstellt ein <code>Optional<\/code>, das den gegebenen Wert enth\u00e4lt. Falls der Wert <code>null<\/code> ist, wird eine <code>NullPointerException<\/code> geworfen.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   Optional&lt;<span class=\"hljs-built_in\">String<\/span>&gt; optional = Optional.of(<span class=\"hljs-string\">\"Hello\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong><code>Optional.ofNullable(T value)<\/code><\/strong>: Erstellt ein <code>Optional<\/code>, das den gegebenen Wert enth\u00e4lt, falls dieser nicht <code>null<\/code> ist. Andernfalls wird ein leeres <code>Optional<\/code> erstellt.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   Optional&lt;<span class=\"hljs-built_in\">String<\/span>&gt; optional = Optional.ofNullable(<span class=\"hljs-literal\">null<\/span>); <span class=\"hljs-comment\">\/\/ Leeres Optional<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong><code>Optional.empty()<\/code><\/strong>: Erstellt ein leeres <code>Optional<\/code>.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">   Optional<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">String<\/span>&gt;<\/span> emptyOptional = Optional.empty();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Abfragen und Manipulation von <code>Optional<\/code>-Objekten<\/h4>\n\n\n\n<p><code>Optional<\/code> bietet verschiedene Methoden, um auf den enthaltenen Wert zuzugreifen und damit zu arbeiten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>isPresent()<\/code><\/strong>: Pr\u00fcft, ob ein Wert vorhanden ist.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   <span class=\"hljs-keyword\">if<\/span> (optional.isPresent()) {\n       System.out.println(<span class=\"hljs-string\">\"Wert ist vorhanden\"<\/span>);\n   }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong><code>ifPresent(Consumer&lt;? super T> action)<\/code><\/strong>: F\u00fchrt die angegebene Aktion aus, wenn ein Wert vorhanden ist.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">   <span class=\"hljs-selector-tag\">optional<\/span><span class=\"hljs-selector-class\">.ifPresent<\/span>(<span class=\"hljs-selector-tag\">value<\/span> <span class=\"hljs-selector-tag\">-<\/span>&gt; <span class=\"hljs-selector-tag\">System<\/span><span class=\"hljs-selector-class\">.out<\/span><span class=\"hljs-selector-class\">.println<\/span>(\"<span class=\"hljs-selector-tag\">Wert<\/span>: \" + <span class=\"hljs-selector-tag\">value<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong><code>orElse(T other)<\/code><\/strong>: Gibt den enthaltenen Wert zur\u00fcck oder einen alternativen Wert, falls kein Wert vorhanden ist.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   <span class=\"hljs-built_in\">String<\/span> result = optional.orElse(<span class=\"hljs-string\">\"Standardwert\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li><strong><code>orElseGet(Supplier&lt;? extends T> other)<\/code><\/strong>: Gibt den enthaltenen Wert zur\u00fcck oder ruft einen <code>Supplier<\/code> auf, um einen alternativen Wert zu erzeugen.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   <span class=\"hljs-built_in\">String<\/span> result = optional.orElseGet(() -&gt; <span class=\"hljs-string\">\"Standardwert\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li><strong><code>orElseThrow(Supplier&lt;? extends X> exceptionSupplier)<\/code><\/strong>: Gibt den enthaltenen Wert zur\u00fcck oder wirft eine Ausnahme, die vom angegebenen <code>Supplier<\/code> erzeugt wird.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   <span class=\"hljs-built_in\">String<\/span> result = optional.orElseThrow(() -&gt; <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Kein Wert vorhanden\"<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li><strong><code>get()<\/code><\/strong>: Gibt den enthaltenen Wert zur\u00fcck, falls vorhanden, andernfalls wird eine <code>NoSuchElementException<\/code> geworfen. Diese Methode sollte mit Vorsicht verwendet werden, da sie potenziell eine Ausnahme werfen kann.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">   <span class=\"hljs-built_in\">String<\/span> value = optional.get();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Funktionsweise in der Praxis<\/h4>\n\n\n\n<p>Ein h\u00e4ufiges Anwendungsszenario f\u00fcr <code>Optional<\/code> ist der Umgang mit Methoden, die m\u00f6glicherweise keinen Wert zur\u00fcckgeben. Anstatt <code>null<\/code> zur\u00fcckzugeben, kann ein <code>Optional<\/code> verwendet werden, um die Abwesenheit eines Wertes anzuzeigen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public Optional&lt;User&gt; findUserById(<span class=\"hljs-built_in\">String<\/span> id) {\n    User user = userRepository.findById(id);\n    <span class=\"hljs-keyword\">return<\/span> Optional.ofNullable(user);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird ein <code>Optional<\/code> zur\u00fcckgegeben, das entweder einen <code>User<\/code> enth\u00e4lt oder leer ist, falls kein Benutzer mit der gegebenen ID gefunden wurde.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile der Verwendung von <code>Optional<\/code><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Vermeidung von <code>NullPointerException<\/code><\/strong>: Durch den expliziten Umgang mit fehlenden Werten k\u00f6nnen <code>NullPointerException<\/code> vermieden werden.<\/li>\n\n\n\n<li><strong>Bessere Lesbarkeit und Wartbarkeit<\/strong>: Der Code wird klarer und expliziter, da sofort ersichtlich ist, dass ein Wert m\u00f6glicherweise fehlen kann.<\/li>\n\n\n\n<li><strong>F\u00f6rderung von Best Practices<\/strong>: Die Verwendung von <code>Optional<\/code> f\u00f6rdert den bewussten Umgang mit fehlenden Werten und zwingt den Entwickler, diese F\u00e4lle explizit zu behandeln.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Kritik und Missbrauch von <code>Optional<\/code><\/h4>\n\n\n\n<p>Trotz der Vorteile gibt es auch einige Kritikpunkte und Missbrauchsm\u00f6glichkeiten:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Nicht f\u00fcr Attribute geeignet<\/strong>: <code>Optional<\/code> sollte nicht f\u00fcr Felder von Klassen verwendet werden. Es ist in erster Linie f\u00fcr R\u00fcckgabewerte von Methoden gedacht. Das Speichern von <code>Optional<\/code>-Objekten in Klassenattributen kann unn\u00f6tig Speicher und Overhead erzeugen.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">   <span class=\"hljs-comment\">\/\/ Schlechte Praxis<\/span>\n   <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span> <\/span>{\n       <span class=\"hljs-keyword\">private<\/span> Optional&lt;String&gt; name;\n   }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Nicht f\u00fcr alle Situationen geeignet<\/strong>: <code>Optional<\/code> sollte nicht \u00fcberall eingesetzt werden, wo <code>null<\/code> vorkommen k\u00f6nnte. In vielen F\u00e4llen kann eine einfache <code>null<\/code>-\u00dcberpr\u00fcfung ausreichend und effizienter sein.<\/li>\n\n\n\n<li><strong>Overhead und Leistung<\/strong>: Die Verwendung von <code>Optional<\/code> kann zus\u00e4tzlichen Overhead und eine geringf\u00fcgige Leistungseinbu\u00dfe bedeuten, insbesondere in performancekritischen Anwendungen.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p><code>Optional<\/code> ist ein m\u00e4chtiges Werkzeug in Java, das dazu beitr\u00e4gt, den Umgang mit potenziell fehlenden Werten sicherer und expliziter zu gestalten. Es f\u00f6rdert die best practices, indem es Entwickler dazu zwingt, F\u00e4lle fehlender Werte explizit zu behandeln. Allerdings sollte <code>Optional<\/code> mit Bedacht eingesetzt werden, insbesondere nicht als Klassenattribute oder in performancekritischen Anwendungen. Richtig verwendet, tr\u00e4gt <code>Optional<\/code> erheblich zur Verbesserung der Codequalit\u00e4t bei und reduziert die Wahrscheinlichkeit von <code>NullPointerException<\/code>.<\/p>\n\n\n\n<p>Insgesamt ist die Einf\u00fchrung von <code>Optional<\/code> ein bedeutender Schritt in Richtung sicherer und sauberer Java-Code, der die Best Practices des defensiven Programmierens unterst\u00fctzt und die Lesbarkeit sowie Wartbarkeit von Code verbessert.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung In der Programmierung treten h\u00e4ufig Situationen auf, in denen eine Variable m\u00f6glicherweise keinen Wert besitzt, was in vielen Sprachen durch null dargestellt wird. In Java kann dies zu NullPointerException f\u00fchren, einer der h\u00e4ufigsten Fehlerquellen. Um diesem Problem entgegenzuwirken, wurde mit Java 8 die Klasse Optional eingef\u00fchrt. Optional ist ein Container-Objekt, das entweder einen Wert [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-392","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=392"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/392\/revisions"}],"predecessor-version":[{"id":393,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/392\/revisions\/393"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}