{"id":355,"date":"2024-04-23T18:05:11","date_gmt":"2024-04-23T17:05:11","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=355"},"modified":"2024-06-03T18:07:58","modified_gmt":"2024-06-03T17:07:58","slug":"das-singleton-design-pattern-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=355","title":{"rendered":"Das Singleton-Design-Pattern in Java"},"content":{"rendered":"\n<p>Das Singleton-Design-Pattern ist eines der bekanntesten und am h\u00e4ufigsten verwendeten Entwurfsmuster in der Softwareentwicklung. Es geh\u00f6rt zur Kategorie der Erzeugungsmuster und dient dazu, sicherzustellen, dass eine Klasse genau eine Instanz hat und einen globalen Zugriffspunkt zu dieser Instanz bietet. In diesem Artikel werden wir das Singleton-Pattern im Detail betrachten, seine Anwendung in Java erkl\u00e4ren und verschiedene Implementierungsm\u00f6glichkeiten sowie deren Vor- und Nachteile diskutieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Definition und Motivation<\/h2>\n\n\n\n<p>Das Singleton-Pattern stellt sicher, dass eine Klasse genau eine Instanz hat. Dies ist n\u00fctzlich, wenn genau eine Instanz einer Klasse notwendig ist, um die Koordination von Aktionen im System zu steuern. Beispiele hierf\u00fcr sind Konfigurationsklassen, Log-Manager, Datenbankverbindungen oder Thread-Pools.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vorteile des Singleton-Patterns<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Zentralisierte Kontrolle<\/strong>: Da nur eine Instanz existiert, kann der Zustand zentral verwaltet werden.<\/li>\n\n\n\n<li><strong>Reduzierter Speicherverbrauch<\/strong>: Da nur eine Instanz existiert, wird weniger Speicher verbraucht.<\/li>\n\n\n\n<li><strong>Globale Zugriffsm\u00f6glichkeit<\/strong>: Die Instanz kann von \u00fcberall im Programm leicht erreicht werden, ohne dass sie immer wieder neu \u00fcbergeben werden muss.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Implementierung in Java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Klassische Implementierung<\/h3>\n\n\n\n<p>Die einfachste und bekannteste Methode, ein Singleton in Java zu implementieren, ist die Verwendung einer statischen Methode, die die Instanz zur\u00fcckgibt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton instance;\n\n    <span class=\"hljs-keyword\">private<\/span> Singleton() {\n        <span class=\"hljs-comment\">\/\/ privater Konstruktor verhindert die Instanziierung<\/span>\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton getInstance() {\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n            instance = <span class=\"hljs-keyword\">new<\/span> Singleton();\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>In dieser Implementierung wird die Instanz erst erzeugt, wenn sie das erste Mal angefordert wird (Lazy Initialization). Der Konstruktor ist privat, um sicherzustellen, dass keine weiteren Instanzen erzeugt werden k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Thread-sichere Implementierung<\/h3>\n\n\n\n<p>Die oben gezeigte Implementierung ist nicht thread-sicher. Wenn mehrere Threads gleichzeitig auf die <code>getInstance()<\/code>-Methode zugreifen, k\u00f6nnte es passieren, dass mehrere Instanzen erzeugt werden. Um dies zu verhindern, kann die Methode synchronisiert werden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton instance;\n\n    <span class=\"hljs-keyword\">private<\/span> Singleton() {\n        <span class=\"hljs-comment\">\/\/ privater Konstruktor verhindert die Instanziierung<\/span>\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> synchronized Singleton getInstance() {\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n            instance = <span class=\"hljs-keyword\">new<\/span> Singleton();\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\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\">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<p>Das Synchronisieren der gesamten Methode kann jedoch zu Performance-Einbu\u00dfen f\u00fchren, da jeder Aufruf von <code>getInstance()<\/code> blockiert wird, bis der erste Aufruf abgeschlossen ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Double-Checked Locking<\/h3>\n\n\n\n<p>Um die Nachteile der vollst\u00e4ndigen Synchronisierung zu vermeiden, kann das sogenannte &#8222;Double-Checked Locking&#8220;-Verfahren verwendet werden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> volatile Singleton instance;\n\n    <span class=\"hljs-keyword\">private<\/span> Singleton() {\n        <span class=\"hljs-comment\">\/\/ privater Konstruktor verhindert die Instanziierung<\/span>\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton getInstance() {\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n            synchronized (Singleton<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>) <\/span>{\n                <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n                    instance = <span class=\"hljs-keyword\">new<\/span> Singleton();\n                }\n            }\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<p>Hier wird zun\u00e4chst ohne Synchronisierung \u00fcberpr\u00fcft, ob die Instanz bereits existiert. Nur wenn dies nicht der Fall ist, wird synchronisiert und erneut gepr\u00fcft, bevor die Instanz erzeugt wird. Dies reduziert die Synchronisierungskosten erheblich. Die <code>volatile<\/code>-Deklaration stellt sicher, dass \u00c4nderungen an <code>instance<\/code> sofort f\u00fcr alle Threads sichtbar sind.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Initialisierung bei Klassenladung<\/h3>\n\n\n\n<p>Eine weitere M\u00f6glichkeit, die Thread-Sicherheit ohne Synchronisierung zu gew\u00e4hrleisten, ist die Initialisierung der Instanz beim Laden der Klasse.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> Singleton instance = <span class=\"hljs-keyword\">new<\/span> Singleton();\n\n    <span class=\"hljs-keyword\">private<\/span> Singleton() {\n        <span class=\"hljs-comment\">\/\/ privater Konstruktor verhindert die Instanziierung<\/span>\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton getInstance() {\n        <span class=\"hljs-keyword\">return<\/span> instance;\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\">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<p>Diese Methode nutzt den Umstand, dass statische Initialisierer in Java thread-sicher sind. Die Instanz wird beim ersten Laden der Klasse erzeugt, was Thread-Sicherheit ohne explizite Synchronisierung gew\u00e4hrleistet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bill Pugh Singleton Design<\/h3>\n\n\n\n<p>Eine weitere elegante Methode, ein Singleton zu implementieren, wurde von Bill Pugh vorgeschlagen. Diese nutzt eine statische innere Klasse.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> Singleton() {\n        <span class=\"hljs-comment\">\/\/ privater Konstruktor verhindert die Instanziierung<\/span>\n    }\n\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SingletonHelper<\/span> <\/span>{\n        <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> Singleton INSTANCE = <span class=\"hljs-keyword\">new<\/span> Singleton();\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton getInstance() {\n        <span class=\"hljs-keyword\">return<\/span> SingletonHelper.INSTANCE;\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\">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<p>Hier wird die Instanz erst dann erzeugt, wenn die innere Klasse <code>SingletonHelper<\/code> geladen wird. Dies geschieht erst, wenn die Methode <code>getInstance()<\/code> aufgerufen wird, was Lazy Initialization gew\u00e4hrleistet und gleichzeitig die Vorteile der Thread-Sicherheit durch die JVM-Mechanismen der Klasseninitialisierung nutzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einsatzgebiete und Beispiele<\/h2>\n\n\n\n<p>Singletons sind in vielen Bereichen der Softwareentwicklung n\u00fctzlich. Hier sind einige typische Einsatzgebiete:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Konfigurationsmanager<\/strong>: Eine zentrale Klasse, die alle Konfigurationsparameter verwaltet.<\/li>\n\n\n\n<li><strong>Logger<\/strong>: Eine einzige Instanz eines Loggers, um konsistente Logging-Informationen zu gew\u00e4hrleisten.<\/li>\n\n\n\n<li><strong>Thread-Pools<\/strong>: Verwaltung und Wiederverwendung von Threads.<\/li>\n\n\n\n<li><strong>Cache<\/strong>: Ein zentrales Caching-System zur Vermeidung redundanter Datenbankabfragen.<\/li>\n\n\n\n<li><strong>Datenbankverbindungen<\/strong>: Verwaltung einer einzelnen Verbindung zu einer Datenbank, um Ressourcen zu schonen.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel: Logger<\/h3>\n\n\n\n<p>Ein typisches Beispiel f\u00fcr die Verwendung des Singleton-Patterns ist ein Logger. Hier ist eine einfache Implementierung eines Loggers als Singleton.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Logger<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Logger instance;\n\n    <span class=\"hljs-keyword\">private<\/span> Logger() {\n        <span class=\"hljs-comment\">\/\/ Initialisierung des Loggers<\/span>\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> synchronized Logger getInstance() {\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n            instance = <span class=\"hljs-keyword\">new<\/span> Logger();\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> void log(String message) {\n        <span class=\"hljs-comment\">\/\/ Logik zum Loggen der Nachricht<\/span>\n        System.out.println(message);\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\">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<p>Mit dieser Implementierung kann der Logger von \u00fcberall im Programm verwendet werden, ohne dass mehrere Instanzen erzeugt werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel: Konfigurationsmanager<\/h3>\n\n\n\n<p>Ein weiteres Beispiel ist ein Konfigurationsmanager, der alle Einstellungen zentral verwaltet.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConfigurationManager<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> ConfigurationManager instance;\n    <span class=\"hljs-keyword\">private<\/span> Properties configProperties;\n\n    <span class=\"hljs-keyword\">private<\/span> ConfigurationManager() {\n        <span class=\"hljs-comment\">\/\/ Laden der Konfigurationsdatei<\/span>\n        configProperties = <span class=\"hljs-keyword\">new<\/span> Properties();\n        <span class=\"hljs-keyword\">try<\/span> {\n            configProperties.load(<span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"config.properties\"<\/span>));\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> synchronized ConfigurationManager getInstance() {\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n            instance = <span class=\"hljs-keyword\">new<\/span> ConfigurationManager();\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> String getProperty(String key) {\n        <span class=\"hljs-keyword\">return<\/span> configProperties.getProperty(key);\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\">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<p>Mit dieser Implementierung k\u00f6nnen alle Konfigurationseinstellungen zentral verwaltet und von \u00fcberall im Programm abgerufen werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nachteile des Singleton-Patterns<\/h2>\n\n\n\n<p>Trotz seiner Vorteile hat das Singleton-Pattern auch einige Nachteile:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Eingeschr\u00e4nkte Testbarkeit<\/strong>: Da die Klasse nur eine Instanz hat, ist es schwierig, sie in Unit-Tests zu mocken oder zu ersetzen.<\/li>\n\n\n\n<li><strong>Verborgene Abh\u00e4ngigkeiten<\/strong>: Singletons k\u00f6nnen dazu f\u00fchren, dass Abh\u00e4ngigkeiten zwischen Klassen weniger offensichtlich sind.<\/li>\n\n\n\n<li><strong>Globale Zust\u00e4nde<\/strong>: Die Verwendung von Singletons kann zu globalen Zust\u00e4nden f\u00fchren, die schwer zu debuggen und zu warten sind.<\/li>\n\n\n\n<li><strong>Erweiterbarkeit<\/strong>: Die starren Strukturen von Singletons k\u00f6nnen die Erweiterbarkeit des Systems einschr\u00e4nken.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Das Singleton-Design-Pattern ist ein m\u00e4chtiges Werkzeug in der Softwareentwicklung, das die Erstellung von Klassen, die nur eine Instanz haben, vereinfacht und kontrolliert. Es ist besonders n\u00fctzlich f\u00fcr zentrale Konfigurationsmanager, Logger und andere globale Dienste. Allerdings sollte das Singleton-Pattern mit Bedacht eingesetzt werden, da es auch Nachteile wie eingeschr\u00e4nkte Testbarkeit und versteckte Abh\u00e4ngigkeiten mit sich bringen kann. Eine sorgf\u00e4ltige Abw\u00e4gung der Vor- und Nachteile ist entscheidend, um die richtige Entscheidung f\u00fcr das jeweilige Problem zu treffen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Singleton-Design-Pattern ist eines der bekanntesten und am h\u00e4ufigsten verwendeten Entwurfsmuster in der Softwareentwicklung. Es geh\u00f6rt zur Kategorie der Erzeugungsmuster und dient dazu, sicherzustellen, dass eine Klasse genau eine Instanz hat und einen globalen Zugriffspunkt zu dieser Instanz bietet. In diesem Artikel werden wir das Singleton-Pattern im Detail betrachten, seine Anwendung in Java erkl\u00e4ren und [&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-355","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\/355","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=355"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/355\/revisions"}],"predecessor-version":[{"id":356,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/355\/revisions\/356"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}