{"id":21013,"date":"2016-03-22T08:00:59","date_gmt":"2016-03-22T07:00:59","guid":{"rendered":"https:\/\/www.inovex.de\/\/?p=1484"},"modified":"2026-03-17T08:00:12","modified_gmt":"2026-03-17T07:00:12","slug":"named-parameters-java-fluent-interfaces","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/","title":{"rendered":"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung"},"content":{"rendered":"<p>Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.<!--more--><\/p>\n<p>In einigen popul\u00e4ren Sprachen gibt es das Feature der Named Parameters. Damit ist es m\u00f6glich, beim Aufruf einer Methode oder Funktion \u00fcber den Parameternamen festzulegen, welcher Parameter welchen Wert erhalten soll. Insbesondere ist die Reihenfolge der Parameter in der Methodendeklaration nicht relevant f\u00fcr die Zuordnung und es ist au\u00dferdem m\u00f6glich, nicht alle vorhandenen Parameter mit Werten zu belegen. Im letzten Fall greifen dann Standardwerte oder Fehlerbehandlungen.<\/p>\n<p>In Java ist dies bis jetzt so nicht m\u00f6glich. Es muss immer f\u00fcr jeden Parameter ein Wert eines kompatiblen Typs \u00fcbergeben werden und die Reihenfolge muss exakt eingehalten werden. Die Zuordnung erfolgt ausschlie\u00dflich \u00fcber die Reihenfolge, woraus folgt, dass an der Aufrufstelle gerade bei Methoden mit vielen Parametern und mehrmaligem Vorkommen derselben Typen nicht ohne weiteres erkennbar ist, welcher Parameter im Aufruf welchen Wert erh\u00e4lt.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#Das-Konzept-des-Method-Chaining\" >Das Konzept des Method-Chaining<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#Der-Methodenaufruf-als-Objekt\" >Der Methodenaufruf als Objekt<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#Einschraenkungen-und-Nachteile-des-Fluent-Interface-mit-Grammatik\" >Einschr\u00e4nkungen und Nachteile des Fluent Interface mit Grammatik<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#Klassenbasierte-Validierung-hat-ihren-Preis\" >Klassenbasierte Validierung hat ihren Preis<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#Were-hiring\" >We&#8217;re hiring!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#Weiterlesen\" >Weiterlesen<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Das-Konzept-des-Method-Chaining\"><\/span>Das Konzept des Method-Chaining<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nun bieten Fluent Interfaces\u00a0das Konzept des Method-Chaining. Damit hat man die Option, den Methodenaufruf durch ein Objekt darzustellen, dem man in einer verketteten Abfolge von einparametrischen und ausdrucksstark benannten Methoden die einzelnen Parameterwerte f\u00fcr die letztliche Ausf\u00fchrung \u00fcbergibt. Die Reihenfolge ist dabei irrelevant, die Mutatoren zeigen mit ihrem jeweiligen Namen eindeutig den gesetzten Parameter an und es m\u00fcssen nur die Werte gesetzt werden, die man konkret belegen will. Alle weiteren werden mit Standardwerten belegt und fehlende Parameter k\u00f6nnen bei der Ausf\u00fchrung der Methode erkannt werden. Im Grunde handelt es sich um ein Parameter-Objekt-Pattern \u2013 und da hier immer dasselbe Objekt zur\u00fcckgeliefert wird, haben wir es mit einem Fluent Interface ohne Grammatik zu tun.<\/p>\n<p>Nehmen wir einen <em>Service<\/em> an, der eine Methode mit mehreren Parametern anbietet, wobei ich hier aus Platzgr\u00fcnden nur eine geringe Anzahl verwende.<\/p>\n<pre class=\"lang:java decode:true \" title=\"Einfache Service-Methode\">public class ActionService {\r\n\r\n    \/\/*\r\n\r\n      * @param number, mandatory\r\n\r\n      * @param flag, optional, default = true\r\n\r\n      *\/\/\r\n\r\n    void performAction(\r\n\r\n        long number,     \/\/ primitver Typ, dadurch kein Null-Wert m\u00f6glich\r\n\r\n        Boolean flag) {    \/\/ kann Null sein\r\n\r\n        boolean flagValue = true;\r\n\r\n        if(flag != null) {\r\n\r\n            flagValue = flag.booleanValue();\r\n\r\n        }\r\n\r\n        ...        \/\/ f\u00fchre Funktion aus\r\n\r\n    }\r\n\r\n}<\/pre>\n<p>Ein Aufruf daran s\u00e4he beispielsweise so aus:<\/p>\n<pre class=\"lang:default decode:true \" title=\" Methodenaufruf am Service\"> service.performAction(100L, false);<\/pre>\n<p>Wenn man nun die Parameter, die die Aktion definieren in ein Parameter-Objekt mit einem Fluent Interface umwandelt und dieses im Service verwendet, s\u00e4he das so aus:<\/p>\n<pre class=\"lang:default decode:true\" title=\"Parameterobjekt mit Fluent Interface\">public class ActionParameter {\r\n\r\n    Long number = null;        \/\/ Object-Typ, muss noch belegt werden, um valide zu sein\r\n\r\n    boolean flag = true;     \/\/ mit Standard-Wert vorbelegt\r\n\r\n    public ActionParameter withNumber(long number) {    \/\/ primitver Typ, um validen Wert zu forcieren\r\n\r\n        this.number = number;\r\n\r\n        return this;\r\n\r\n    }\r\n\r\n    public ActionParameter withFlag(boolean flag) {\r\n\r\n        this.flag = flag;\r\n\r\n        return this;\r\n\r\n    }\r\n\r\n    public boolean isValid() {\r\n\r\n        return (number != null);\r\n\r\n    }\r\n\r\n}\r\n\r\npublic class ActionService {\r\n\r\n    void performAction(ActionParameter parameter) {\r\n\r\n    if(parameter.isValid()) {\r\n\r\n        ...        \/\/ f\u00fchre Funktion aus\r\n\r\n    } else {\r\n\r\n        ...        \/\/ behandle invalide Werte\r\n\r\n    }\r\n\r\n}<\/pre>\n<p>Es w\u00e4ren dann die folgenden Aufrufe m\u00f6glich.<\/p>\n<pre class=\"lang:default decode:true \" title=\"Methodenaufruf am Service mit Parameterobjekt\">    service.perform(new ActionParameter()\r\n\r\n        .withNumber(100L)\r\n\r\n        .withFlag(true));\r\n\r\n    \/\/ equivalent to previous\r\n\r\n    service.perform(new ActionParameter()\r\n\r\n        .withFlag(false)\r\n\r\n        .withNumber(100L));\r\n\r\n    \/\/ use default\r\n\r\n    service.perform(new ActionParameter()\r\n\r\n        .withNumber(100L));\r\n\r\n    \/\/ invalid: missing number value\r\n\r\n    service.perform(new ActionParameter()\r\n\r\n        .withFlag(true));<\/pre>\n<p>Das Parameter-Objekt kann nat\u00fcrlich auch \u00fcber ein Builder Pattern mit Fluent Interface erzeugt werden, was recht praktisch ist wenn man eine Reihe von \u00e4hnlichen Aufrufen mit nur geringen Unterschieden in einzelnen Attributen ausf\u00fchren m\u00f6chte.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Der-Methodenaufruf-als-Objekt\"><\/span>Der Methodenaufruf als Objekt<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Es ist au\u00dferdem m\u00f6glich, dass das Objekt nicht einfach die Parameter kapselt, sondern den ganzen Methodenaufruf repr\u00e4sentiert. Der Aufrufer w\u00fcrde sich dabei mit Hilfe des Service eine Instanz dieser <em>Action<\/em> erzeugen, diese durch Belegen der Parameter mit Werten in einen validen Zustand bringen und letztlich an dieser Instanz beispielsweise eine <em>action.invoke()<\/em> Methode aufrufen.<\/p>\n<p>Je nach Einsatzgebiet und Anwendungsfall kann diese Methode bereits die gesamte Funktion implementieren. Notwendige Kollaborateure kann der Service der Action Instanz bei Erzeugung \u00fcbergeben haben, wodurch er f\u00fcr diese Funktion zu einer Factory wird. Alternativ kann der <em>Service<\/em> auch sich selbst an die <em>Action<\/em> \u00fcbergeben, ggf. unter einem anderen Interface als dieses f\u00fcr den Aufrufer sichtbar ist, oder die <em>Action<\/em> kann als Innere Klasse implizit auf interne Funktionen des <em>Service<\/em> zugreifen. Hier ist haupts\u00e4chlich ma\u00dfgebend, wie komplex die jeweilige Funktion ist und ob Kollaborateure aus einem DI-Kontext o.\u00e4. involviert sind.<\/p>\n<pre class=\"lang:default decode:true\" title=\"Service als Factory f\u00fcr Methodenobjekt\">public class FluentActionService {\r\n\r\n    \/\/ f\u00fcr externe Aufrufer sichtbar, liefert Representant der Aktion zur\u00fcck\r\n\r\n    public Action performAction() {\r\n\r\n        return new Action();\r\n\r\n    }\r\n\r\n    \/\/ f\u00fcr den Representanten sichtbar\r\n\r\n    private void performAction(long number, boolean flag) {\r\n\r\n        ...        \/\/ f\u00fchre Funktion aus\r\n\r\n    }\r\n\r\n    public class Action {    \/\/ innere Klasse mit implizitem Zugriff auf die erzeugende Service-Instanz\r\n\r\n    private Action() { }\r\n\r\n        Long number = null;        \/\/ Object-Typ, muss noch belegt werden, um valide zu sein\r\n\r\n        boolean flag = true;\r\n\r\n        public Action withNumber(long number) {    \/\/ primitver Typ, um validen Wert zu forcieren\r\n\r\n            this.number = number;\r\n\r\n            return this;\r\n\r\n        }\r\n\r\n        public Action withFlag(boolean flag) {\r\n\r\n            this.flag = flag;\r\n\r\n            return this;\r\n\r\n        }\r\n\r\n        public boolean isValid() {\r\n\r\n            return (number != null);\r\n\r\n        }\r\n\r\n        public void invoke() {\r\n\r\n            if(isValid()) {\r\n\r\n                performAction(this.number.longValue(), this.flag));\r\n\r\n            } else {\r\n\r\n                ...        \/\/ behandle invalide Werte\r\n\r\n            }\r\n\r\n        }\r\n\r\n    }\r\n\r\n}<\/pre>\n<p>Die <em>Action<\/em> Instanz f\u00fchrt bei diesem Konzept einen Zustand mit, der abh\u00e4ngig von der Belegung der Pflichtparameter valide oder invalide ist. Nur in einem validen Zustand kann die Funktion erfolgreich ausgef\u00fchrt werden. Allerdings ist das nur zur Laufzeit feststellbar. Es w\u00e4re doch w\u00fcnschenswert, wenn man bereits zur Entwicklungszeit erkennen k\u00f6nnte, ob die Funktion valide ist oder nicht.<\/p>\n<p>Das Fluent Interface erm\u00f6glicht es, bei jedem Methodenaufruf eine Instanz einer anderen Klasse zur\u00fcck zu liefern. Es hat damit eine Grammatik und die beteiligten Klassen, die gemeinsam das Fluent Interface bilden, werden als Mediatoren bezeichnet. Wenn die Mediatoren die einzelnen Zust\u00e4nde eines entsprechenden Automaten repr\u00e4sentieren, dann sind die Methoden die Transitionen zwischen diesen Zust\u00e4nden. Zu Beginn h\u00e4tte man also eine Instanz von <em>InvalidAction<\/em> und der Mutator f\u00fcr den letzten fehlenden Pflichtparameter w\u00fcrde dann eine Instanz von <em>Action<\/em> mit allen bisher gesammelten Werten liefern, die dann auch erst eine <em>action.invoke()<\/em> Methode aufweist.<\/p>\n<pre class=\"lang:default decode:true \" title=\"Fluent Interface mit Grammatik\">...\r\n\r\n    public class InvalidAction {\r\n\r\n    private InvalidAction() { }\r\n\r\n        boolean flag = true;\r\n\r\n        public Action withNumber(long number) {\r\n\r\n            this.number = number;\r\n\r\n            return new Action(number, this.flag);    \/\/ liefert Instanz des neuen Mediators mit gesammelten Werten\r\n\r\n        }\r\n\r\n        public InvalidAction withFlag(boolean flag) {\r\n\r\n            this.flag = flag;\r\n\r\n            return this;\r\n\r\n        }\r\n\r\n        \/\/ keine invoke() Methode\r\n\r\n    }\r\n\r\n    public class Action {\r\n\r\n        private Action(long number, boolean flag) {\r\n\r\n            this.number = number;\r\n\r\n            this.flag = flag;\r\n\r\n        }\r\n\r\n        long number = null;        \/\/ valider Wert bei Erzeugung gesetzt\r\n\r\n        boolean flag = true;\r\n\r\n        public Action withNumber(long number) {    \/\/ primitiver Typ, um valide Werte zu forcieren\r\n\r\n            this.number = number;\r\n\r\n            return this;\r\n\r\n        }\r\n\r\n        public Action withFlag(boolean flag) {\r\n\r\n            this.flag = flag;\r\n\r\n            return this;\r\n\r\n        }\r\n\r\n        public void invoke() {\r\n\r\n            performAction(this.number, this.flag);\r\n\r\n        }\r\n\r\n    }<\/pre>\n<p>Beim Aufruf sieht man von diesen Klassen erst einmal nichts, solange man die Methodenfolge nicht unterbricht.<\/p>\n<pre class=\"lang:default decode:true\" title=\"Aufruf am Methodenobjekt verbirgt Mediatoren\">    service.performAction()    \/\/ -&gt; InvalidAction\r\n\r\n        .withFlag(true)        \/\/ -&gt; InvalidAction, .invoke() f\u00fchrt zu Kompiler-Fehler\r\n\r\n        .withNumber(50L)       \/\/ -&gt; Action\r\n\r\n        .invoke();             \/\/ ist erst hier m\u00f6glich\r\n\r\n<\/pre>\n<p>Leider hat diese Vorgehensweise sehr starke Einschr\u00e4nkungen und weitere Nachteile.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Einschraenkungen-und-Nachteile-des-Fluent-Interface-mit-Grammatik\"><\/span>Einschr\u00e4nkungen und Nachteile des Fluent Interface mit Grammatik<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Der gro\u00dfe Vorteil, dass nur Instanzen von validen Mediatoren eine <em>.invoke()<\/em> Methode haben, die also ansonsten gar nicht aufgerufen werden kann, und daher auch kein Validit\u00e4tspr\u00fcfung zur Laufzeit durchf\u00fchren muss, bringt mit sich, dass die Schnittstelle der Mediatoren sehr unflexibel wird und der innere Zustand der einzelnen Instanzen nicht zur Validierung beitragen kann. Effektiv bedeutet das, dass eine Transition immer nur zu einem Folgezustand f\u00fchren kann, unabh\u00e4ngig davon, welcher Parameterwert der entsprechenden Methode eingegeben wird.<\/p>\n<p>In diesem Beispiel muss ein <em>invalidAction.withNumber(xx)<\/em> immer zu einer validen <em>Action<\/em> f\u00fchren. Sollte es fachliche Anforderungen an den Wert geben, z.B. nur positive Werte zu akzeptieren, ist diese Fallunterscheidung schlicht nicht m\u00f6glich denn der R\u00fcckgabetyp der Methode ist als valide <em>Action<\/em> vorgegeben. Viel schwerwiegender als dieses Szenario ist die Tatsache, dass s\u00e4mtliche Pflichtparameter mit Objekt-Typen diesen Ansatz unm\u00f6glich machen, weil nicht verhindert werden kann, dass die Mutatoren mit <em>Null<\/em>-Werten aufgerufen werden.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Klassenbasierte-Validierung-hat-ihren-Preis\"><\/span>Klassenbasierte Validierung hat ihren Preis<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Wie Eingangs erw\u00e4hnt zeigt sich der praktische Nutzen des Konzepts erst wirklich, wenn man es mit einer gr\u00f6\u00dferen Anzahl von Parametern zu tun hat. Soll die M\u00f6glichkeit der beliebigen Reihenfolge bei der Parametereingabe aufrecht erhalten werden, w\u00e4chst der Zustandsraum des Automaten sehr schnell, da f\u00fcr jede Permutation aller Pflichtparameter ein eigener Mediator angelegt werden muss. Die Mutatoren aller optionalen Parameter m\u00fcssen dann an all diesen Klassen dupliziert werden. Eine Vererbung dieser gemeinsamen Methoden ist zwar m\u00f6glich aber im Kontext eines Fluent Interface mit zus\u00e4tzlicher Komplexit\u00e4t verbunden, wie ich in einem weiteren Artikel genauer ausf\u00fchren werde.<\/p>\n<p>Die Menge der anzulegenden Mediatoren kann auf eine lineare Entwicklung mit der Parameteranzahl reduziert werden, wenn man die Reihenfolge der Parametereingabe auf einen konkreten Pfad durch den Zustandsgraphen beschr\u00e4nkt. Dadurch geht aber wieder ein Teil der urspr\u00fcnglich angestrebten Flexibilit\u00e4t verloren. Eine klassenbasierte Validierung ist also nur in einigen F\u00e4llen m\u00f6glich und auch dann sollten Kosten und Nutzen gut abgewogen werden.<\/p>\n<p>Solange die Validierung zur Laufzeit ausreicht, bietet ein Fluent Interface jedoch wie gezeigt eine gute M\u00f6glichkeit, sich dem Konzept der Named Parameters in Java anzun\u00e4hern, wenn man darauf nicht verzichten m\u00f6chte.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Were-hiring\"><\/span>We&#8217;re hiring!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Tapetenwechsel gef\u00e4llig? Wir sind auf der Suche nach begeisterten Software-Entwicklern, die uns im Umfeld von Java, .NET und JavaScript unterst\u00fctzen und auch von extravaganteren Sprachen wie Go, Elixir und Clojure nicht zur\u00fcckschrecken. <strong>Jetzt Bewerben!<\/strong><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Weiterlesen\"><\/span>Weiterlesen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Weitere Information zu unseren Leistungen gibt es auf\u00a0unserer <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/\" target=\"_blank\" rel=\"noopener\">Website<\/a>, der direkte Kontakt zu uns ist telefonisch unter <a href=\"tel:+497216190210\">+49 721 619 021-0<\/a> oder jederzeit per <a href=\"mailto:list-blog@inovex.de\" target=\"_blank\" rel=\"noopener\">E-Mail an list-blog@inovex.de<\/a> m\u00f6glich.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.<\/p>\n","protected":false},"author":25,"featured_media":12438,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[510,68],"service":[420,425],"coauthors":[{"id":25,"display_name":"Sebastian Schmidt","user_nicename":"sschmidt"}],"class_list":["post-21013","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-apps-2","tag-backend","service-apps","service-backend"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-22T07:00:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T07:00:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"755\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sebastian Schmidt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-1024x302.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Schmidt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Sebastian Schmidt\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/\"},\"author\":{\"name\":\"Sebastian Schmidt\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a2ffffeaeaa18b9961297ca47e5f3799\"},\"headline\":\"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung\",\"datePublished\":\"2016-03-22T07:00:59+00:00\",\"dateModified\":\"2026-03-17T07:00:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/\"},\"wordCount\":1192,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"keywords\":[\"Apps\",\"Backend\"],\"articleSection\":[\"Applications\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/\",\"name\":\"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"datePublished\":\"2016-03-22T07:00:59+00:00\",\"dateModified\":\"2026-03-17T07:00:12+00:00\",\"description\":\"Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"width\":2560,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/named-parameters-java-fluent-interfaces\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a2ffffeaeaa18b9961297ca47e5f3799\",\"name\":\"Sebastian Schmidt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg5f905a8b3627c2eb15cdb285c29fe6cf\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg\",\"caption\":\"Sebastian Schmidt\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/sschmidt\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung - inovex GmbH","description":"Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/","og_locale":"de_DE","og_type":"article","og_title":"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung - inovex GmbH","og_description":"Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.","og_url":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2016-03-22T07:00:59+00:00","article_modified_time":"2026-03-17T07:00:12+00:00","og_image":[{"width":2560,"height":755,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","type":"image\/jpeg"}],"author":"Sebastian Schmidt","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-1024x302.jpg","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Sebastian Schmidt","Gesch\u00e4tzte Lesezeit":"8\u00a0Minuten","Written by":"Sebastian Schmidt"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/"},"author":{"name":"Sebastian Schmidt","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a2ffffeaeaa18b9961297ca47e5f3799"},"headline":"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung","datePublished":"2016-03-22T07:00:59+00:00","dateModified":"2026-03-17T07:00:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/"},"wordCount":1192,"commentCount":1,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","keywords":["Apps","Backend"],"articleSection":["Applications","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/","url":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/","name":"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","datePublished":"2016-03-22T07:00:59+00:00","dateModified":"2026-03-17T07:00:12+00:00","description":"Durch Verwendung eines Fluent Interface kann man in Java einige Vorteile von Named Parameters nachbilden. In diesem Artikel zeigen wir, wie.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","width":2560,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/named-parameters-java-fluent-interfaces\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Named Parameters in Java mit Fluent Interfaces: Eine Ann\u00e4herung"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a2ffffeaeaa18b9961297ca47e5f3799","name":"Sebastian Schmidt","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg5f905a8b3627c2eb15cdb285c29fe6cf","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg","caption":"Sebastian Schmidt"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/sschmidt\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=21013"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21013\/revisions"}],"predecessor-version":[{"id":66546,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21013\/revisions\/66546"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/12438"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=21013"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=21013"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=21013"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=21013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}