{"id":38861,"date":"2023-12-05T15:30:21","date_gmt":"2023-12-05T14:30:21","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=38861"},"modified":"2026-06-08T11:13:28","modified_gmt":"2026-06-08T09:13:28","slug":"flexible-constructor-bodies","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/flexible-constructor-bodies\/","title":{"rendered":"Flexible Constructor Bodies in Java 25: Code vor super() ausf\u00fchren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Artikel erf\u00e4hrst du:<\/p>\n\n\n\n<ul class=\"wp-block-list hc-checked-list\">\n<li>wie du ab Java 25 (ab Java 22 als Preview-Feature) Code in Konstruktoren auch vor dem Aufruf von <code>super(...)<\/code> oder <code>this(...)<\/code> ausf\u00fchren kannst,<\/li>\n\n\n\n<li>welche Einschr\u00e4nkungen es dabei gibt,<\/li>\n\n\n\n<li>was <em>Prolog<\/em> und <em>Epilog<\/em> eines Konstruktors sind,<\/li>\n\n\n\n<li>und ob die Neuerungen auch f\u00fcr Records und Enums gelten.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Gehen wir einen Schritt zur\u00fcck: Warum sollte man Code vor <code>super(...)<\/code> oder <code>this(...)<\/code> ausf\u00fchren wollen?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"code-in-konstruktoren-status-quo-vor-java-25\">Code in Konstruktoren \u2013 Status Quo vor Java 25<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die folgenden Beispiele zeigen zum einen Workarounds, die bisher erforderlich waren, um vor dem Aufruf von <code>super()<\/code> oder <code>this()<\/code> Parameter zu validieren oder zu berechnen \u2013 und zum anderen, was schief gehen konnte, wenn der Konstruktor der Elternklasse eine Methode aufruft, die in der Kindklasse \u00fcberschrieben wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"use-case-1-validierung-von-parametern\">Use Case 1: Validierung von Parametern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein h\u00e4ufiger Use Case ist die Validierung von Parametern einer Kindklasse. Im folgenden Beispiel ruft der Konstruktor von <code>Rectangle<\/code> erst den Konstruktor der Elternklasse, <code>Shape<\/code>, auf und validiert und setzt danach die Breite und H\u00f6he:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Shape<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> Color color;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Shape<\/span><span class=\"hljs-params\">(Color color)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>.color = color;\n  }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Rectangle<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Shape<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">double<\/span> width;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">double<\/span> height;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Rectangle<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> width, <span class=\"hljs-keyword\">double<\/span> height)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>(color);\n    <span class=\"hljs-keyword\">if<\/span> (width &lt; <span class=\"hljs-number\">0<\/span> || height &lt; <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException();\n    <span class=\"hljs-keyword\">this<\/span>.width = width;\n    <span class=\"hljs-keyword\">this<\/span>.height = height;\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Effizienter w\u00e4re es allerdings, die Parameter zu validieren, <em>bevor<\/em> der Super-Konstruktor aufgerufen wird. Doch das ist bisher nur mit dem folgenden, extrem unsch\u00f6nen Workaround m\u00f6glich:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Rectangle<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> width, <span class=\"hljs-keyword\">double<\/span> height)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">super<\/span>(validateParams(color, width, height));\n  <span class=\"hljs-keyword\">this<\/span>.width = width;\n  <span class=\"hljs-keyword\">this<\/span>.height = height;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Color <span class=\"hljs-title\">validateParams<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> width, <span class=\"hljs-keyword\">double<\/span> height)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> (width &lt; <span class=\"hljs-number\">0<\/span> || height &lt; <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException();\n  <span class=\"hljs-keyword\">return<\/span> color;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"use-case-2-berechnung-eines-arguments-das-an-mehrere-parameter-uebergeben-wird\">Use Case 2: Berechnung eines Arguments, das an mehrere Parameter \u00fcbergeben wird<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein weiterer Use Case ist die Berechnung von Werten, die an mehr als einen Superklassen-Konstruktorparameter weitergegeben werden sollen. Im folgenden Beispiel wollen wir ein Quadrat mit vorgegebener Fl\u00e4che erzeugen (dass eine statische Factory-Methode mit aussagekr\u00e4ftigem Namen daf\u00fcr geeigneter w\u00e4re als der Konstruktor wollen wir an dieser Stelle ignorieren):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Square<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Rectangle<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">int<\/span> area)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>(color, Math.sqrt(area), Math.sqrt(area));\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Um die Wurzel der Fl\u00e4che nicht zweimal zu berechnen, m\u00fcssten wir einen Hilfskonstruktor einf\u00fchren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Square<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Rectangle<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">int<\/span> area)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>(color, Math.sqrt(area));\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> sideLength)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>(color, sideLength, sideLength);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Das ist hier aber auch nur deshalb m\u00f6glich, weil <code>area<\/code> vom Typ <code>int<\/code> ist. W\u00e4re <code>area<\/code> wie <code>sideLength<\/code> vom Typ <code>double<\/code>, w\u00fcrde das nicht funktionieren, da wir dann zwei Konstruktoren mit identischer Signatur h\u00e4tten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und wollten wir zuvor sichergehen, dass <code>area<\/code> nicht negativ ist, m\u00fcssten wir eine dritte Methode einf\u00fchren, da wir auch vor <code>this(...)<\/code> keinen anderen Code ausf\u00fchren d\u00fcrfen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Square<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Rectangle<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">int<\/span> area)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>(color, Math.sqrt(validateArea(area)));\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">validateArea<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> area)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (area &lt; <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException();\n    <span class=\"hljs-keyword\">return<\/span> area;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> sideLength)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>(color, sideLength, sideLength);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Es ist kaum noch ersichtlich, was dieser Code tut.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"use-case-3-aufruf-einer-ueberschriebenen-methode-im-super-konstruktor\">Use Case 3: Aufruf einer \u00fcberschriebenen Methode im Super-Konstruktor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir bleiben beim <code>Shape<\/code>\/<code>Rectangle<\/code>-Beispiel und f\u00fcgen eine <code>printMe()<\/code>-Methode hinzu, die im Konstruktor von <code>Shape<\/code> aufgerufen und in <code>Rectangle<\/code> \u00fcberschrieben wird:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Shape<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> Color color;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Shape<\/span><span class=\"hljs-params\">(Color color)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>.color = color;\n    printMe();\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">printMe<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    System.out.println(<span class=\"hljs-string\">\"color = \"<\/span> + color);\n  }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Rectangle<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Shape<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">double<\/span> width;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">double<\/span> height;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Rectangle<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> width, <span class=\"hljs-keyword\">double<\/span> height)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>(color);\n    <span class=\"hljs-keyword\">if<\/span> (width &lt; <span class=\"hljs-number\">0<\/span> || height &lt; <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException();\n    <span class=\"hljs-keyword\">this<\/span>.width = width;\n    <span class=\"hljs-keyword\">this<\/span>.height = height;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">printMe<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>.printMe();\n    System.out.println(<span class=\"hljs-string\">\"width = \"<\/span> + width + <span class=\"hljs-string\">\", height = \"<\/span> + height);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wenn wir nun z. B. <code>new Rectangle(Color.RED, 29.7, 21.0)<\/code> aufrufen, dann wird nicht etwa <code>color = RED<\/code> und <code>width = 29.7, height = 21.0<\/code> ausgegeben, sondern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">color = RED\nwidth = 0.0, height = 0.0<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Der Grund daf\u00fcr ist, dass <code>printMe()<\/code> vom <code>Shape<\/code>-Konstruktor aufgerufen wird, <em>bevor<\/em> im <code>Rectangle<\/code>-Konstruktor <code>width<\/code> und <code>height<\/code> initialisiert werden. <code>printMe()<\/code> sieht also noch die Default-Werte von <code>width<\/code> und <code>height<\/code>, also jeweils 0,0.<\/p>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"1427197203\" src=\"https:\/\/happycoders.kit.com\/1427197203\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"java-code-vor-super-und-this\">Java-Code vor super(...) und this(...)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-22-features\/#statements-before-super-preview-jep-447\">Java 22<\/a> wurde \u2013 zun\u00e4chst als Preview-Feature und unter dem Namen \u201eStatements before super(\u2026)\u201c \u2013 die M\u00f6glichkeit eingef\u00fchrt, Code auch vor dem Aufruf von <code>super(...)<\/code> oder <code>this(...)<\/code> auszuf\u00fchren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir k\u00f6nnen damit zun\u00e4chst die Validierung der Fl\u00e4che <em>vor<\/em> den Aufruf von <code>this(...)<\/code> ziehen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Square<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Rectangle<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">int<\/span> area)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (area &lt; <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException();  <span class=\"hljs-comment\">\/\/ \u27f5 Validation before `this`<\/span>\n    <span class=\"hljs-keyword\">this<\/span>(color, Math.sqrt(area));\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> sideLength)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">super<\/span>(color, sideLength, sideLength);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Und auch den Hilfskonstruktor brauchen wir nicht mehr. Parametervalidierung und Berechnung der Seitenl\u00e4nge k\u00f6nnen nun direkt im Konstruktor untergebracht werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Square<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">int<\/span> area)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> (area &lt; <span class=\"hljs-number\">0<\/span>) <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException();  <span class=\"hljs-comment\">\/\/ \u27f5 Validation before `super`<\/span>\n  <span class=\"hljs-keyword\">double<\/span> sideLength = Math.sqrt(area);                 <span class=\"hljs-comment\">\/\/ \u27f5 Calculation before `super`<\/span>\n  <span class=\"hljs-keyword\">super<\/span>(color, sideLength, sideLength);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Bei diesem Konstruktor ist auf einen Blick erkennbar, was der Code macht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In einem \u00fcberarbeiteten Preview in <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-23-features\/#flexible-constructor-bodies-second-preview-jep-482\">Java 23<\/a> wurde zudem die M\u00f6glichkeit geschaffen, vor dem Aufruf von <code>super(...)<\/code> Felder der Klasse zu initialisieren. Wir d\u00fcrfen damit die <code>Rectangle<\/code>-Klasse so schreiben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Rectangle<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Shape<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">double<\/span> width;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">double<\/span> height;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Rectangle<\/span><span class=\"hljs-params\">(Color color, <span class=\"hljs-keyword\">double<\/span> width, <span class=\"hljs-keyword\">double<\/span> height)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>.width = width;    <span class=\"hljs-comment\">\/\/ \u27f5 Field initialization before `super`<\/span>\n    <span class=\"hljs-keyword\">this<\/span>.height = height;  <span class=\"hljs-comment\">\/\/ \u27f5 Field initialization before `super`<\/span>\n    <span class=\"hljs-keyword\">super<\/span>(color);\n  }\n\n  . . .\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Bei einem Aufruf von <code>new Rectangle(Color.RED, 29.7, 21.0)<\/code> liefert die vom Konstruktor aufgerufene <code>printMe()<\/code>-Methode nun die erwartete Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">color = RED\nwidth = 29.7, height = 21.0<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Warum funktioniert das jetzt? Der Prolog \u2013 also <code>this.width = width;<\/code> und <code>this.height = height;<\/code> \u2013 wird vollst\u00e4ndig ausgef\u00fchrt, bevor <code>super(color)<\/code> und damit der <code>Shape<\/code>-Konstruktor l\u00e4uft. Wenn dieser nun <code>printMe()<\/code> aufruft, sind <code>width<\/code> und <code>height<\/code> bereits gesetzt. Genau das war vorher unm\u00f6glich: Jeder Code stand zwangsl\u00e4ufig <em>nach<\/em> <code>super(\u2026)<\/code> \u2013 und damit zu sp\u00e4t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Allgemein gilt: Beim Erzeugen eines Objekts werden zuerst die Prologe von der Kindklasse aufw\u00e4rts bis zur Elternklasse abgearbeitet, danach wird jeder Konstruktor ab dem Aufruf von <code>super(\u2026)<\/code> ausgef\u00fchrt, von der Elternklasse abw\u00e4rts. Felder, die du im Prolog setzt, stehen also schon bereit, wenn der Super-Konstruktor zu arbeiten beginnt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flexible Constructor Bodies sind seit <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-25-features\/#flexible-constructor-bodies-jep-513\">Java 25<\/a> als finalisiertes Feature verf\u00fcgbar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"konstruktor-prolog-und-epilog\">Konstruktor-Prolog und -Epilog<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der Block <em>vor<\/em> dem Aufruf von <code>super(...)<\/code> oder <code>this(...)<\/code> in einem Konstruktor wird Prolog genannt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Code <em>nach<\/em> dem Aufruf von <code>super(...)<\/code> oder <code>this(...)<\/code> oder Code in einem Konstruktor <em>ohne<\/em> Aufruf von <code>super(...)<\/code> oder <code>this(...)<\/code> wird als Epilog bezeichnet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"einschraenkungen\">Einschr\u00e4nkungen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Im Prolog darf der Code Felder initialisieren, aber nicht <em>lesend<\/em> auf Felder der Klasse zugreifen und keine nicht-statischen Methoden der Klasse aufrufen. Er darf au\u00dferdem keine Instanzen von nicht-statischen inneren Klassen erzeugen, da diese dann eine Referenz auf das potentiell uninitialisierte Elternobjekt haben w\u00fcrden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Prolog des Konstruktors einer <em>inneren<\/em> Klasse darf hingegen uneingeschr\u00e4nkt auf Felder und Methoden der \u00e4u\u00dferen Klasse zugreifen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"records-und-enums\">Records und Enums<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Records und Enums k\u00f6nnen zwar nicht von einer selbst gew\u00e4hlten Klasse erben, deren Konstruktoren k\u00f6nnen allerdings mit <code>this(...)<\/code> alternative Konstruktoren aufrufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auch davor darf nun Code, der den oben genannten Einschr\u00e4nkungen standh\u00e4lt, ausgef\u00fchrt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"historie\">Historie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Flexible Constructor Bodies<\/em> wurden in folgenden JDK Enhancement Proposals definiert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Java 22: <a href=\"https:\/\/openjdk.org\/jeps\/447\">JEP 447: Statements before super(...) (Preview)<\/a><\/li>\n\n\n\n<li>Java 23: <a href=\"https:\/\/openjdk.org\/jeps\/482\">JEP 482: Flexible Constructor Bodies (Second Preview)<\/a><\/li>\n\n\n\n<li>Java 24: <a href=\"https:\/\/openjdk.org\/jeps\/492\">JEP 492: Flexible Constructor Bodies (Third Preview)<\/a><\/li>\n\n\n\n<li>Java 25: <a href=\"https:\/\/openjdk.org\/jeps\/513\">JEP 513: Flexible Constructor Bodies<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"fazit\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ausf\u00fchren von Code vor <code>super(...)<\/code> oder <code>this(...)<\/code> erlaubt es, Felder zu initialisieren und Parameter zu validieren oder zu berechnen, bevor der Super-Konstruktor oder ein alternativer Konstruktor aufgerufen wird. Das macht den Code sicherer und erm\u00f6glicht deutlich ausdrucksst\u00e4rkeren Code als die Workarounds, die wir bisher f\u00fcr solche Zwecke konstruieren mussten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flexible Constructor Bodies wurden in <a href=\"https:\/\/www.happycoders.eu\/de\/java\/java-25-features\/#flexible-constructor-bodies-jep-513\">Java 25<\/a> finalisiert und stehen seitdem ohne Preview-Flag zur Verf\u00fcgung. Falls du noch Java 22, 23 oder 24 einsetzt, kannst du das Feature dort als Preview mit <code>--enable-preview --release &lt;Version&gt;<\/code> aktivieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Musstest du auch schon komplizierte Workarounds implementieren, und wie findest du das neue Feature? Lass es mich \u00fcber die Kommentarfunktion wissen!<\/p>\n<aside><p>Wenn dir der Artikel weitergeholfen hat, w\u00fcrde ich mich sehr \u00fcber eine positive Bewertung auf meinem <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">ProvenExpert-Profil<\/a> freuen. Dein Feedback hilft mir, meine Inhalte weiter zu verbessern und motiviert mich, neue informative Artikel zu schreiben.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">Bewertung abgeben<\/a><\/p>\r\n                        <p>Du m\u00f6chtest \u00fcber alle neuen Java-Features auf dem Laufenden sein? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"#\" data-formkit-toggle=\"d8ee997126\">Newsletter-Anmeldung<\/a><\/p><\/aside>","protected":false},"excerpt":{"rendered":"<p>Ab Java 22 kannst du endlich Code in Konstruktoren vor dem Aufruf von super(...) oder this(...) ausf\u00fchren. Dieser Artikel zeigt dir wie. <\/p>\n","protected":false},"author":1,"featured_media":38867,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"Flexible Constructor Bodies in Java: Code vor super() ausf\u00fchren","_seopress_titles_desc":"Flexible Constructor Bodies: Seit Java 25 kannst du in Konstruktoren Code vor super(...) und this(...) ausf\u00fchren. Dieser Artikel zeigt dir, wie das geht.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":9783,"_post_count":0,"footnotes":""},"categories":[64],"tags":[179],"class_list":["post-38861","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-amber-de"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/12\/statements-before-super.v3.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":2,"uagb_excerpt":"Ab Java 22 kannst du endlich Code in Konstruktoren vor dem Aufruf von super(...) oder this(...) ausf\u00fchren. Dieser Artikel zeigt dir wie.","public_identification_id":"1c7c63e9e3374acab17e42406b46094b","private_identification_id":"138b68e22b8d4411a0d946a33f77984a","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/38861","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=38861"}],"version-history":[{"count":15,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/38861\/revisions"}],"predecessor-version":[{"id":56433,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/38861\/revisions\/56433"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/38867"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=38861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=38861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=38861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}