{"id":41028,"date":"2026-03-02T23:40:50","date_gmt":"2026-03-02T20:40:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=41028"},"modified":"2026-03-02T23:40:50","modified_gmt":"2026-03-02T20:40:50","slug":"java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/","title":{"rendered":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m"},"content":{"rendered":"<p><body><\/p>\n<h2>Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m<\/h2>\n<p>Java, y\u0131llar i\u00e7inde s\u00fcrekli geli\u015ferek yaz\u0131l\u0131m d\u00fcnyas\u0131n\u0131n en k\u00f6kl\u00fc ve yayg\u0131n dillerinden biri olmu\u015ftur. Her yeni s\u00fcr\u00fcm, dilin yeteneklerini geni\u015fleten, performans\u0131 art\u0131ran ve geli\u015ftirici deneyimini iyile\u015ftiren \u00f6nemli yenilikler sunar. Java 9, 2017 y\u0131l\u0131nda piyasaya s\u00fcr\u00fcld\u00fc\u011f\u00fcnde, bu gelene\u011fi s\u00fcrd\u00fcrerek \u00f6zellikle mod\u00fclerlik alan\u0131nda devrim niteli\u011finde de\u011fi\u015fiklikler getirdi. Bu makalede, Java 9&#8217;un getirdi\u011fi ba\u015fl\u0131ca \u00f6zelliklere derinlemesine bakacak, her birini \u00f6rneklerle a\u00e7\u0131klayarak Java ekosistemine olan etkilerini inceleyece\u011fiz.<\/p>\n<h3>Java Platform Mod\u00fcl Sistemi (JPMS &#8211; Project Jigsaw)<\/h3>\n<p>Java 9&#8217;un \u015f\u00fcphesiz en \u00f6nemli ve \u00e7\u0131\u011f\u0131r a\u00e7\u0131c\u0131 \u00f6zelli\u011fi, Java Platform Mod\u00fcl Sistemi (JPMS), yani pop\u00fcler ad\u0131yla Project Jigsaw&#8217;dur. Bu \u00f6zellik, Java SE platformunu ve JDK&#8217;y\u0131 mod\u00fcler hale getirerek, b\u00fcy\u00fck ve monolitik bir yap\u0131dan daha y\u00f6netilebilir, g\u00fcvenli ve performansl\u0131 mod\u00fcllere ay\u0131rmay\u0131 ama\u00e7lam\u0131\u015ft\u0131r.<\/p>\n<h4>Mod\u00fclerli\u011fin Temel Faydalar\u0131<\/h4>\n<p>*   <strong>G\u00fcvenilirlik:<\/strong> Mod\u00fcller aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar a\u00e7\u0131k\u00e7a tan\u0131mland\u0131\u011f\u0131 i\u00e7in, \u00e7al\u0131\u015fma zaman\u0131nda beklenmeyen ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131 (JAR Hell) azal\u0131r. Her mod\u00fcl, hangi paketleri d\u0131\u015fa aktard\u0131\u011f\u0131n\u0131 ve hangi mod\u00fcllere ihtiya\u00e7 duydu\u011funu net bir \u015fekilde belirtir.<br \/>\n*   <strong>Daha G\u00fc\u00e7l\u00fc Kaps\u00fclleme:<\/strong> Mod\u00fcller, yaln\u0131zca d\u0131\u015fa aktard\u0131klar\u0131 (exported) paketlerin d\u0131\u015far\u0131dan eri\u015filebilir olmas\u0131n\u0131 sa\u011flar. Bu, i\u00e7 implementasyon detaylar\u0131n\u0131n d\u0131\u015f d\u00fcnyaya s\u0131zmas\u0131n\u0131 engeller ve API&#8217;nin daha istikrarl\u0131 olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Daha K\u00fc\u00e7\u00fck \u00c7al\u0131\u015fma Zaman\u0131 G\u00f6r\u00fcnt\u00fcleri (Runtime Images):<\/strong> <code>jlink<\/code> arac\u0131 sayesinde, uygulaman\u0131z\u0131n yaln\u0131zca ihtiya\u00e7 duydu\u011fu JDK mod\u00fcllerini i\u00e7eren \u00f6zel bir Java \u00e7al\u0131\u015fma zaman\u0131 g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturabilirsiniz. Bu, \u00f6zellikle mikroservisler ve IoT cihazlar\u0131 i\u00e7in daha k\u00fc\u00e7\u00fck da\u011f\u0131t\u0131m boyutlar\u0131 ve daha h\u0131zl\u0131 ba\u015flang\u0131\u00e7 s\u00fcreleri anlam\u0131na gelir.<br \/>\n*   <strong>Geli\u015fmi\u015f Performans:<\/strong> Daha iyi kaps\u00fclleme ve mod\u00fcl s\u0131n\u0131rlar\u0131, JVM&#8217;nin daha verimli optimizasyonlar yapmas\u0131na olanak tan\u0131r.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> B\u00fcy\u00fck uygulamalar\u0131 daha k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z mod\u00fcllere b\u00f6lmek, uygulaman\u0131n farkl\u0131 par\u00e7alar\u0131n\u0131n ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Mod\u00fcl Tan\u0131mlama: <code>module-info.java<\/code><\/h4>\n<p>Bir mod\u00fcl, <code>module-info.java<\/code> ad\u0131nda \u00f6zel bir dosya ile tan\u0131mlan\u0131r. Bu dosya, mod\u00fcl\u00fcn ad\u0131n\u0131, d\u0131\u015fa aktard\u0131\u011f\u0131 paketleri (exports), ihtiya\u00e7 duydu\u011fu di\u011fer mod\u00fclleri (requires) ve di\u011fer mod\u00fcllere hizmet sunup sunmad\u0131\u011f\u0131n\u0131 (provides\/uses) belirtir.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Basit bir mod\u00fcl yap\u0131s\u0131<\/p>\n<p>Diyelim ki iki mod\u00fcl\u00fcm\u00fcz var: <code>com.example.app<\/code> (ana uygulama) ve <code>com.example.lib<\/code> (bir yard\u0131mc\u0131 k\u00fct\u00fcphane).<\/p>\n<p><strong><code>com.example.lib<\/code> mod\u00fcl\u00fc i\u00e7in <code>module-info.java<\/code>:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ src\/com.example.lib\/module-info.java\nmodule com.example.lib {\n    exports com.example.lib.utils; \/\/ Bu paketi d\u0131\u015f d\u00fcnyaya a\u00e7\n}<\/code><\/pre>\n<p><strong><code>com.example.lib<\/code> i\u00e7indeki bir s\u0131n\u0131f:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ src\/com.example.lib\/com\/example\/lib\/utils\/StringUtil.java\npackage com.example.lib.utils;\n\npublic class StringUtil {\n    public static String capitalize(String text) {\n        if (text == null || text.isEmpty()) {\n            return text;\n        }\n        return Character.toUpperCase(text.charAt(0)) + text.substring(1).toLowerCase();\n    }\n}<\/code><\/pre>\n<p><strong><code>com.example.app<\/code> mod\u00fcl\u00fc i\u00e7in <code>module-info.java<\/code>:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ src\/com.example.app\/module-info.java\nmodule com.example.app {\n    requires com.example.lib; \/\/ com.example.lib mod\u00fcl\u00fcne ba\u011f\u0131ml\u0131y\u0131z\n}<\/code><\/pre>\n<p><strong><code>com.example.app<\/code> i\u00e7indeki ana s\u0131n\u0131f:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ src\/com.example.app\/com\/example\/app\/MainApp.java\npackage com.example.app;\n\nimport com.example.lib.utils.StringUtil; \/\/ com.example.lib'den StringUtil'i kullan\u0131yoruz\n\npublic class MainApp {\n    public static void main(String[] args) {\n        String original = \"hello world\";\n        String capitalized = StringUtil.capitalize(original);\n        System.out.println(\"Original: \" + original);\n        System.out.println(\"Capitalized: \" + capitalized);\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>com.example.app<\/code> mod\u00fcl\u00fc, <code>com.example.lib<\/code> mod\u00fcl\u00fcn\u00fc <code>requires<\/code> anahtar kelimesiyle gerektirir. <code>com.example.lib<\/code> ise <code>exports<\/code> anahtar kelimesiyle <code>com.example.lib.utils<\/code> paketini di\u011fer mod\u00fcllerin kullan\u0131m\u0131na a\u00e7ar. Bu sayede <code>MainApp<\/code>, <code>StringUtil<\/code> s\u0131n\u0131f\u0131na eri\u015febilir. E\u011fer <code>com.example.lib<\/code> <code>StringUtil<\/code> s\u0131n\u0131f\u0131n\u0131n paketini d\u0131\u015fa aktarmasayd\u0131, <code>MainApp<\/code> derleme hatas\u0131 al\u0131rd\u0131.<\/p>\n<h4><code>jlink<\/code> Arac\u0131<\/h4>\n<p><code>jlink<\/code>, uygulaman\u0131z i\u00e7in \u00f6zel bir \u00e7al\u0131\u015fma zaman\u0131 g\u00f6r\u00fcnt\u00fcs\u00fc (runtime image) olu\u015fturman\u0131z\u0131 sa\u011flayan bir ara\u00e7t\u0131r. Bu, uygulaman\u0131z\u0131n yaln\u0131zca ihtiya\u00e7 duydu\u011fu Java mod\u00fcllerini i\u00e7erir ve daha k\u00fc\u00e7\u00fck, daha optimize edilmi\u015f da\u011f\u0131t\u0131mlar sa\u011flar.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-bash\"># Uygulaman\u0131z\u0131n JAR dosyalar\u0131n\u0131 ve mod\u00fcllerini derledi\u011finizi varsayal\u0131m\n<h2>Mod\u00fcl yolu: --module-path out<\/h2>\n<h2>Ana mod\u00fcl: com.example.app<\/h2>\n<h2>Ana s\u0131n\u0131f: com.example.app.MainApp<\/h2>\n\njlink --module-path out:path\/to\/jdk\/jmods \\\n      --add-modules com.example.app \\\n      --output myapp-runtime \\\n      --launcher myapp=com.example.app\/com.example.app.MainApp<\/code><\/pre>\n<p>Bu komut, <code>myapp-runtime<\/code> ad\u0131nda bir dizin olu\u015fturur ve i\u00e7ine uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gereken minimum JVM ve mod\u00fclleri yerle\u015ftirir. Art\u0131k uygulaman\u0131z\u0131 bu dizindeki <code>bin\/myapp<\/code> komut dosyas\u0131yla \u00e7al\u0131\u015ft\u0131rabilirsiniz, harici bir JDK kurulumuna ihtiya\u00e7 duymadan.<\/p>\n<h3>JShell (REPL Arac\u0131)<\/h3>\n<p>Java 9 ile birlikte gelen bir di\u011fer \u00f6nemli \u00f6zellik JShell&#8217;dir. JShell, Java i\u00e7in bir Read-Eval-Print Loop (REPL) arac\u0131d\u0131r. Bu, geli\u015ftiricilerin Java kod par\u00e7ac\u0131klar\u0131n\u0131 an\u0131nda \u00e7al\u0131\u015ft\u0131rmas\u0131na, test etmesine ve \u00f6\u011frenmesine olanak tan\u0131r. Python veya Ruby gibi dillerdeki interaktif kabuklara benzer.<\/p>\n<h4>JShell&#8217;in Faydalar\u0131<\/h4>\n<p>*   <strong>H\u0131zl\u0131 Prototipleme:<\/strong> K\u00fc\u00e7\u00fck kod par\u00e7ac\u0131klar\u0131n\u0131 veya algoritmalar\u0131 h\u0131zl\u0131ca test etmek i\u00e7in idealdir.<br \/>\n*   <strong>\u00d6\u011frenme ve Ke\u015ffetme:<\/strong> Java&#8217;ya yeni ba\u015flayanlar i\u00e7in veya mevcut Java geli\u015ftiricilerinin yeni API&#8217;leri ke\u015ffetmesi i\u00e7in harika bir ara\u00e7t\u0131r.<br \/>\n*   <strong>Hata Ay\u0131klama:<\/strong> Karma\u015f\u0131k bir projeyi derlemeye ve \u00e7al\u0131\u015ft\u0131rmaya gerek kalmadan belirli bir fonksiyonun veya ifadenin davran\u0131\u015f\u0131n\u0131 kontrol edebilirsiniz.<\/p>\n<h4>\u00d6rnek Kullan\u0131m<\/h4>\n<p>Terminalden <code>jshell<\/code> yazarak JShell&#8217;i ba\u015flatabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">jshell<\/code><\/pre>\n<p>Kar\u015f\u0131n\u0131za a\u015fa\u011f\u0131daki gibi bir prompt gelecektir:<\/p>\n<pre><code class=\"language-\">|  Welcome to JShell -- Version 9.0.4\n|  For an introduction type: \/help intro\n\njshell><\/code><\/pre>\n<p>\u015eimdi baz\u0131 Java kodlar\u0131 yazal\u0131m:<\/p>\n<pre><code class=\"language-java\">jshell> int x = 10;\nx ==> 10\n\njshell> int y = 20;\ny ==> 20\n\njshell> int sum = x + y;\nsum ==> 30\n\njshell> System.out.println(\"Toplam: \" + sum);\nToplam: 30\n\njshell> String message = \"Merhaba JShell\";\nmessage ==> \"Merhaba JShell\"\n\njshell> message.toUpperCase();\n$5 ==> \"MERHABA JSHELL\"\n\njshell> class Greeter {\n...>     String greet(String name) {\n...>         return \"Hello, \" + name + \"!\";\n...>     }\n...> }\n|  created class Greeter\n\njshell> Greeter greeter = new Greeter();\ngreeter ==> Greeter@...\n\njshell> greeter.greet(\"D\u00fcnya\");\n$8 ==> \"Hello, D\u00fcnya!\"\n\njshell> \/list \/\/ Ge\u00e7mi\u015f komutlar\u0131 listele<\/code><\/pre>\n<p>JShell, yazd\u0131\u011f\u0131n\u0131z her ifadeyi an\u0131nda de\u011ferlendirir ve sonucunu g\u00f6sterir. S\u0131n\u0131flar, metotlar ve de\u011fi\u015fkenler tan\u0131mlayabilir, bunlar\u0131 an\u0131nda kullanabilirsiniz. <code>\/list<\/code>, <code>\/vars<\/code>, <code>\/methods<\/code>, <code>\/classes<\/code>, <code>\/imports<\/code> gibi komutlarla mevcut durumu kontrol edebilirsiniz. \u00c7\u0131kmak i\u00e7in <code>\/exit<\/code> yazman\u0131z yeterlidir.<\/p>\n<h3>HTTP\/2 \u0130stemcisi (Incubator Mod\u00fcl\u00fc)<\/h3>\n<p>Java 9, modern HTTP standartlar\u0131n\u0131 (HTTP\/2 ve WebSockets) destekleyen yeni bir HTTP istemcisi API&#8217;sini bir &#8220;incubator&#8221; mod\u00fcl\u00fc olarak tan\u0131tt\u0131. Bu API, eski <code>HttpURLConnection<\/code> s\u0131n\u0131f\u0131na k\u0131yasla daha esnek, performansl\u0131 ve kullan\u0131m\u0131 kolay bir alternatif sunar. Java 11&#8217;de tam olarak kararl\u0131 hale gelmi\u015ftir.<\/p>\n<h4>\u00d6nemli \u00d6zellikler<\/h4>\n<p>*   <strong>HTTP\/2 Deste\u011fi:<\/strong> \u00c7oklu istekleri tek bir ba\u011flant\u0131 \u00fczerinden g\u00f6nderme yetene\u011fi ile performans art\u0131\u015f\u0131 sa\u011flar.<br \/>\n*   <strong>WebSockets Deste\u011fi:<\/strong> \u00c7ift y\u00f6nl\u00fc ileti\u015fim i\u00e7in WebSockets protokol\u00fcn\u00fc destekler.<br \/>\n*   <strong>Asenkron ve Non-Blocking:<\/strong> <code>CompletableFuture<\/code> ile entegre olarak asenkron istekler g\u00f6nderme yetene\u011fi sunar, bu da I\/O i\u015flemlerini bloke etmeden daha verimli kaynak kullan\u0131m\u0131 sa\u011flar.<br \/>\n*   <strong>Fluent API:<\/strong> Daha okunabilir ve zincirleme \u00e7a\u011fr\u0131lara izin veren bir API tasar\u0131m\u0131.<\/p>\n<h4>\u00d6rnek Kullan\u0131m (GET \u0130ste\u011fi)<\/h4>\n<pre><code class=\"language-java\">\/\/ Bu mod\u00fcl\u00fc kullanmak i\u00e7in module-info.java dosyan\u0131za\n\/\/ requires jdk.incubator.http; eklemeniz gerekir.\nimport jdk.incubator.http.HttpClient;\nimport jdk.incubator.http.HttpRequest;\nimport jdk.incubator.http.HttpResponse;\nimport java.net.URI;\nimport java.util.concurrent.CompletableFuture;\n\npublic class Http2ClientExample {\n    public static void main(String[] args) throws Exception {\n        HttpClient client = HttpClient.newHttpClient(); \/\/ Yeni bir HTTP istemcisi olu\u015ftur\n        \n        HttpRequest request = HttpRequest.newBuilder()\n                .uri(URI.create(\"https:\/\/jsonplaceholder.typicode.com\/todos\/1\")) \/\/ Hedef URI\n                .GET() \/\/ GET iste\u011fi\n                .build();\n        \n        \/\/ Senkron \u0130stek\n        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n        System.out.println(\"Senkron \u0130stek Durum Kodu: \" + response.statusCode());\n        System.out.println(\"Senkron \u0130stek Yan\u0131t\u0131: \" + response.body());\n\n        System.out.println(\"\\n-----------------------------------\\n\");\n\n        \/\/ Asenkron \u0130stek\n        CompletableFuture<HttpResponse<String>> futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());\n        \n        futureResponse.thenApply(HttpResponse::body)\n                      .thenAccept(body -> System.out.println(\"Asenkron \u0130stek Yan\u0131t\u0131: \" + body))\n                      .join(); \/\/ Asenkron i\u015flemin tamamlanmas\u0131n\u0131 bekle\n        \n        System.out.println(\"Asenkron \u0130stek Tamamland\u0131.\");\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnek, hem senkron hem de asenkron bir GET iste\u011finin nas\u0131l yap\u0131laca\u011f\u0131n\u0131 g\u00f6sterir. <code>HttpClient<\/code> s\u0131n\u0131f\u0131, istekleri g\u00f6ndermek i\u00e7in kullan\u0131l\u0131rken, <code>HttpRequest<\/code> iste\u011fi yap\u0131land\u0131rmak ve <code>HttpResponse<\/code> ise yan\u0131t\u0131 i\u015flemek i\u00e7in kullan\u0131l\u0131r. Asenkron yakla\u015f\u0131m, <code>CompletableFuture<\/code> kullanarak non-blocking I\/O sa\u011flar.<\/p>\n<h3>Aray\u00fczlerde Private Metotlar<\/h3>\n<p>Java 8 ile birlikte aray\u00fczlere <code>default<\/code> ve <code>static<\/code> metotlar eklendi. Java 9, bu yetene\u011fi daha da geni\u015fleterek aray\u00fczlere <code>private<\/code> metotlar ekleme imkan\u0131 sundu. Bu \u00f6zellik, aray\u00fcz i\u00e7indeki <code>default<\/code> veya <code>static<\/code> metotlar aras\u0131nda kod tekrar\u0131n\u0131 azaltmak ve karma\u015f\u0131k mant\u0131\u011f\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>Faydalar\u0131<\/h4>\n<p>*   <strong>Kod Tekrar\u0131n\u0131 Azaltma:<\/strong> Birden fazla <code>default<\/code> veya <code>static<\/code> metotta kullan\u0131lan ortak yard\u0131mc\u0131 mant\u0131\u011f\u0131 <code>private<\/code> bir metotta toplayabilirsiniz.<br \/>\n*   <strong>Daha Temiz Aray\u00fczler:<\/strong> Karma\u015f\u0131k <code>default<\/code> metotlar\u0131 daha k\u00fc\u00e7\u00fck, okunabilir par\u00e7alara ay\u0131rarak aray\u00fcz\u00fcn okunabilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Kaps\u00fclleme:<\/strong> Bu metotlar yaln\u0131zca aray\u00fcz i\u00e7inde kullan\u0131labilir, d\u0131\u015far\u0131dan eri\u015filemezler, bu da aray\u00fcz\u00fcn i\u00e7 implementasyon detaylar\u0131n\u0131 korur.<\/p>\n<h4>\u00d6rnek Kullan\u0131m<\/h4>\n<pre><code class=\"language-java\">interface MyInterface {\n    default void printMessage(String message) {\n        System.out.println(\"Mesaj\u0131n\u0131z: \" + formatMessage(message));\n    }\n\n    default void logAndPrint(String message) {\n        logMessage(message);\n        System.out.println(\"Logland\u0131 ve yazd\u0131r\u0131ld\u0131: \" + formatMessage(message));\n    }\n\n    \/\/ Private default metot\n    private String formatMessage(String message) {\n        return \"[\" + message.toUpperCase() + \"]\";\n    }\n\n    \/\/ Private static metot\n    private static void logMessage(String message) {\n        System.out.println(\"LOG: \" + message);\n    }\n}\n\npublic class InterfacePrivateMethodExample implements MyInterface {\n    public static void main(String[] args) {\n        MyInterface instance = new InterfacePrivateMethodExample();\n        instance.printMessage(\"Merhaba D\u00fcnya\");\n        instance.logAndPrint(\"Bu bir test mesaj\u0131d\u0131r\");\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>formatMessage<\/code> metodu <code>printMessage<\/code> ve <code>logAndPrint<\/code> default metotlar\u0131 taraf\u0131ndan kullan\u0131lmak \u00fczere <code>private<\/code> olarak tan\u0131mlanm\u0131\u015ft\u0131r. <code>logMessage<\/code> ise <code>private static<\/code> bir metottur ve yine aray\u00fcz i\u00e7indeki di\u011fer metotlar taraf\u0131ndan kullan\u0131labilir. Bu sayede, formatlama mant\u0131\u011f\u0131 tek bir yerde toplanm\u0131\u015f ve kod tekrar\u0131 \u00f6nlenmi\u015ftir.<\/p>\n<h3>Koleksiyonlar \u0130\u00e7in Fabrika Metotlar\u0131<\/h3>\n<p>Java 9, immutable (de\u011fi\u015ftirilemez) koleksiyonlar olu\u015fturmak i\u00e7in yeni, kullan\u0131\u015fl\u0131 fabrika metotlar\u0131 tan\u0131tt\u0131. <code>List<\/code>, <code>Set<\/code> ve <code>Map<\/code> aray\u00fczlerine eklenen bu statik metotlar, daha az kodla ve daha g\u00fcvenli bir \u015fekilde koleksiyonlar olu\u015fturmay\u0131 sa\u011flar.<\/p>\n<h4>Faydalar\u0131<\/h4>\n<p>*   <strong>K\u0131sal\u0131k:<\/strong> Tek sat\u0131rda immutable koleksiyonlar olu\u015fturmay\u0131 sa\u011flar, <code>new ArrayList<>()<\/code>, <code>add()<\/code>, <code>Collections.unmodifiableList()<\/code> gibi uzun kodlara gerek kalmaz.<br \/>\n*   <strong>De\u011fi\u015ftirilemezlik:<\/strong> Olu\u015fturulan koleksiyonlar varsay\u0131lan olarak de\u011fi\u015ftirilemezdir. Bu, program\u0131n\u0131z\u0131n daha g\u00fcvenli olmas\u0131n\u0131 sa\u011flar, \u00e7\u00fcnk\u00fc koleksiyonun i\u00e7eri\u011finin yanl\u0131\u015fl\u0131kla de\u011fi\u015ftirilmesini engeller.<br \/>\n*   <strong>Null-Safety:<\/strong> Bu metotlar <code>null<\/code> elemanlar\u0131 kabul etmez ve <code>NullPointerException<\/code> f\u0131rlat\u0131r, bu da yayg\u0131n bir hata t\u00fcr\u00fcn\u00fc \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<h4>\u00d6rnek Kullan\u0131m<\/h4>\n<pre><code class=\"language-java\">import java.util.List;\nimport java.util.Set;\nimport java.util.Map;\n\npublic class CollectionFactoryMethodsExample {\n    public static void main(String[] args) {\n        \/\/ Immutable List olu\u015fturma\n        List<String> immutableList = List.of(\"Elma\", \"Armut\", \"Kiraz\");\n        System.out.println(\"Immutable List: \" + immutableList);\n        \/\/ immutableList.add(\"Muz\"); \/\/ UnsupportedOperationException f\u0131rlat\u0131r\n\n        \/\/ Immutable Set olu\u015fturma\n        Set<Integer> immutableSet = Set.of(1, 2, 3, 1); \/\/ Tekrar eden elemanlar dikkate al\u0131nmaz\n        System.out.println(\"Immutable Set: \" + immutableSet); \/\/ \u00c7\u0131kt\u0131: [1, 2, 3] (s\u0131ra garanti edilmez)\n        \/\/ immutableSet.add(4); \/\/ UnsupportedOperationException f\u0131rlat\u0131r\n\n        \/\/ Immutable Map olu\u015fturma\n        Map<String, Integer> immutableMap = Map.of(\"Bir\", 1, \"\u0130ki\", 2, \"\u00dc\u00e7\", 3);\n        System.out.println(\"Immutable Map: \" + immutableMap);\n        \/\/ immutableMap.put(\"D\u00f6rt\", 4); \/\/ UnsupportedOperationException f\u0131rlat\u0131r\n\n        \/\/ Map.ofEntries() ile daha fazla giri\u015f i\u00e7eren Map olu\u015fturma\n        Map<String, String> countryCapitals = Map.ofEntries(\n            Map.entry(\"T\u00fcrkiye\", \"Ankara\"),\n            Map.entry(\"Fransa\", \"Paris\"),\n            Map.entry(\"Almanya\", \"Berlin\")\n        );\n        System.out.println(\"\u00dclke Ba\u015fkentleri: \" + countryCapitals);\n\n        \/\/ Null eleman denemesi (hata verir)\n        try {\n            List<String> nullList = List.of(\"A\", null, \"B\");\n        } catch (NullPointerException e) {\n            System.err.println(\"Hata: Null elemanlara izin verilmez: \" + e.getMessage());\n        }\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekler, <code>List.of()<\/code>, <code>Set.of()<\/code>, <code>Map.of()<\/code> ve <code>Map.ofEntries()<\/code> metotlar\u0131n\u0131n nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 g\u00f6sterir. Bu metotlar, s\u0131ras\u0131yla 10, 10 ve 10 adede kadar eleman\/giri\u015f i\u00e7in a\u015f\u0131r\u0131 y\u00fcklenmi\u015f versiyonlara sahiptir. Daha fazla eleman i\u00e7in de\u011fi\u015fken arg\u00fcmanl\u0131 (varargs) versiyonlar kullan\u0131labilir.<\/p>\n<h3>Stream API Geli\u015ftirmeleri<\/h3>\n<p>Java 8 ile tan\u0131t\u0131lan Stream API, koleksiyonlar \u00fczerinde fonksiyonel tarzda i\u015flemler yapmay\u0131 kolayla\u015ft\u0131rm\u0131\u015ft\u0131. Java 9, bu API&#8217;ye birka\u00e7 yeni metot ekleyerek daha da g\u00fc\u00e7l\u00fc hale getirdi.<\/p>\n<h4><code>takeWhile()<\/code> ve <code>dropWhile()<\/code><\/h4>\n<p>Bu metotlar, bir ko\u015fula g\u00f6re stream&#8217;i kesmek veya elemanlar\u0131 atlamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>takeWhile(Predicate predicate)<\/code>: Stream&#8217;in ba\u015f\u0131ndan itibaren verilen ko\u015ful do\u011fru oldu\u011fu s\u00fcrece elemanlar\u0131 al\u0131r ve ko\u015ful ilk kez yanl\u0131\u015f oldu\u011funda durur.<br \/>\n*   <code>dropWhile(Predicate predicate)<\/code>: Stream&#8217;in ba\u015f\u0131ndan itibaren verilen ko\u015ful do\u011fru oldu\u011fu s\u00fcrece elemanlar\u0131 atar ve ko\u015ful ilk kez yanl\u0131\u015f oldu\u011funda kalan t\u00fcm elemanlar\u0131 al\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong><\/p>\n<pre><code class=\"language-java\">import java.util.stream.Stream;\n\npublic class StreamApiEnhancementsExample {\n    public static void main(String[] args) {\n        \/\/ takeWhile \u00f6rne\u011fi\n        Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1)\n              .takeWhile(n -> n < 5)\n              .forEach(n -> System.out.print(n + \" \")); \/\/ \u00c7\u0131kt\u0131: 1 2 3 4\n        System.out.println(\"\\n\");\n\n        \/\/ dropWhile \u00f6rne\u011fi\n        Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1)\n              .dropWhile(n -> n < 3)\n              .forEach(n -> System.out.print(n + \" \")); \/\/ \u00c7\u0131kt\u0131: 3 4 5 4 3 2 1\n        System.out.println(\"\\n\");\n\n        \/\/ ofNullable() \u00f6rne\u011fi\n        Stream<String> s1 = Stream.ofNullable(\"Merhaba\");\n        s1.forEach(System.out::println); \/\/ \u00c7\u0131kt\u0131: Merhaba\n\n        Stream<String> s2 = Stream.ofNullable(null);\n        s2.forEach(System.out::println); \/\/ Hi\u00e7bir \u015fey yazd\u0131rmaz\n\n        \/\/ iterate() geli\u015ftirmesi (predicate ile)\n        Stream.iterate(1, n -> n < 10, n -> n * 2)\n              .forEach(n -> System.out.print(n + \" \")); \/\/ \u00c7\u0131kt\u0131: 1 2 4 8\n        System.out.println(\"\\n\");\n    }\n}<\/code><\/pre>\n<h4><code>ofNullable()<\/code><\/h4>\n<p>Bu metot, tek bir elemandan bir stream olu\u015fturur. E\u011fer eleman <code>null<\/code> ise, bo\u015f bir stream d\u00f6nd\u00fcr\u00fcr. Bu, <code>null<\/code> kontrolleri yapmadan stream olu\u015fturmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4><code>iterate()<\/code> Geli\u015ftirmesi<\/h4>\n<p><code>Stream.iterate()<\/code> metodu art\u0131k bir ba\u015flang\u0131\u00e7 de\u011feri, bir ko\u015ful (<code>Predicate<\/code>) ve bir sonraki eleman\u0131 \u00fcreten bir tekli i\u015flem (<code>UnaryOperator<\/code>) alabilir. Bu, sonsuz stream&#8217;ler olu\u015fturmak yerine belirli bir ko\u015ful alt\u0131nda sonlanan stream&#8217;ler olu\u015fturmay\u0131 sa\u011flar.<\/p>\n<h3>Optional API Geli\u015ftirmeleri<\/h3>\n<p>Java 8 ile tan\u0131t\u0131lan <code>Optional<\/code> s\u0131n\u0131f\u0131, <code>null<\/code> de\u011ferleri y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir yol sunar. Java 9, bu s\u0131n\u0131f\u0131 daha da kullan\u0131\u015fl\u0131 hale getiren birka\u00e7 yeni metot ekledi.<\/p>\n<h4><code>ifPresentOrElse()<\/code><\/h4>\n<p>Bu metot, <code>Optional<\/code> bir de\u011fer i\u00e7eriyorsa belirli bir i\u015flemi ger\u00e7ekle\u015ftirir, aksi takdirde ba\u015fka bir i\u015flemi ger\u00e7ekle\u015ftirir. <code>ifPresent()<\/code> ve <code>orElse()<\/code> kombinasyonuna benzer, ancak daha k\u0131sad\u0131r.<\/p>\n<h4><code>or()<\/code><\/h4>\n<p>E\u011fer <code>Optional<\/code> bo\u015fsa, bu metot verilen <code>Supplier<\/code> taraf\u0131ndan sa\u011flanan ba\u015fka bir <code>Optional<\/code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h4><code>stream()<\/code><\/h4>\n<p>Bu metot, <code>Optional<\/code> bir de\u011fer i\u00e7eriyorsa tek elemanl\u0131 bir <code>Stream<\/code> d\u00f6nd\u00fcr\u00fcr, aksi takdirde bo\u015f bir <code>Stream<\/code> d\u00f6nd\u00fcr\u00fcr. Bu, <code>Optional<\/code> de\u011ferlerini do\u011frudan Stream API zincirine entegre etmeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong><\/p>\n<pre><code class=\"language-java\">import java.util.Optional;\n\npublic class OptionalEnhancementsExample {\n    public static void main(String[] args) {\n        Optional<String> name = Optional.of(\"Alice\");\n        Optional<String> emptyName = Optional.empty();\n\n        \/\/ ifPresentOrElse() \u00f6rne\u011fi\n        name.ifPresentOrElse(\n            val -> System.out.println(\"Merhaba \" + val + \"!\"),\n            () -> System.out.println(\"\u0130sim yok.\")\n        ); \/\/ \u00c7\u0131kt\u0131: Merhaba Alice!\n\n        emptyName.ifPresentOrElse(\n            val -> System.out.println(\"Merhaba \" + val + \"!\"),\n            () -> System.out.println(\"\u0130sim yok.\")\n        ); \/\/ \u00c7\u0131kt\u0131: \u0130sim yok.\n\n        \/\/ or() \u00f6rne\u011fi\n        Optional<String> result1 = name.or(() -> Optional.of(\"Varsay\u0131lan \u0130sim\"));\n        System.out.println(\"or() ile sonu\u00e7 1: \" + result1.get()); \/\/ \u00c7\u0131kt\u0131: Alice\n\n        Optional<String> result2 = emptyName.or(() -> Optional.of(\"Varsay\u0131lan \u0130sim\"));\n        System.out.println(\"or() ile sonu\u00e7 2: \" + result2.get()); \/\/ \u00c7\u0131kt\u0131: Varsay\u0131lan \u0130sim\n\n        \/\/ stream() \u00f6rne\u011fi\n        name.stream().forEach(s -> System.out.println(\"Stream'den gelen: \" + s)); \/\/ \u00c7\u0131kt\u0131: Stream'den gelen: Alice\n        emptyName.stream().forEach(s -> System.out.println(\"Stream'den gelen: \" + s)); \/\/ Hi\u00e7bir \u015fey yazd\u0131rmaz\n    }\n}<\/code><\/pre>\n<h3>CompletableFuture API Geli\u015ftirmeleri<\/h3>\n<p><code>CompletableFuture<\/code>, Java 8&#8217;de asenkron programlamay\u0131 kolayla\u015ft\u0131rmak i\u00e7in tan\u0131t\u0131lm\u0131\u015ft\u0131. Java 9, bu API&#8217;ye zaman a\u015f\u0131m\u0131 ve yeni fabrika metotlar\u0131 gibi eklemelerle daha fazla esneklik ve kontrol sa\u011flad\u0131.<\/p>\n<h4><code>orTimeout()<\/code> ve <code>completeOnTimeout()<\/code><\/h4>\n<p>Bu metotlar, asenkron bir i\u015flemin belirli bir s\u00fcre i\u00e7inde tamamlanmamas\u0131 durumunda otomatik olarak bir eylem ger\u00e7ekle\u015ftirmeyi sa\u011flar.<br \/>\n*   <code>orTimeout(long timeout, TimeUnit unit)<\/code>: Belirtilen s\u00fcre i\u00e7inde tamamlanmazsa <code>TimeoutException<\/code> ile tamamlan\u0131r.<br \/>\n*   <code>completeOnTimeout(T value, long timeout, TimeUnit unit)<\/code>: Belirtilen s\u00fcre i\u00e7inde tamamlanmazsa verilen de\u011ferle tamamlan\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong><\/p>\n<pre><code class=\"language-java\">import java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\n\npublic class CompletableFutureEnhancementsExample {\n    public static void main(String[] args) throws InterruptedException, ExecutionException {\n        \/\/ orTimeout() \u00f6rne\u011fi\n        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {\n            try {\n                TimeUnit.SECONDS.sleep(3); \/\/ 3 saniye bekler\n            } catch (InterruptedException e) {\n                Thread.currentThread().interrupt();\n            }\n            return \"\u0130\u015flem Tamamland\u0131\";\n        });\n\n        try {\n            String result = future1.orTimeout(1, TimeUnit.SECONDS).get(); \/\/ 1 saniye sonra zaman a\u015f\u0131m\u0131\n            System.out.println(\"Sonu\u00e7 1: \" + result);\n        } catch (TimeoutException e) {\n            System.err.println(\"Hata 1: \u0130\u015flem zaman a\u015f\u0131m\u0131na u\u011frad\u0131!\"); \/\/ Bu k\u0131s\u0131m \u00e7al\u0131\u015f\u0131r\n        }\n\n        \/\/ completeOnTimeout() \u00f6rne\u011fi\n        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {\n            try {\n                TimeUnit.SECONDS.sleep(3); \/\/ 3 saniye bekler\n            } catch (InterruptedException e) {\n                Thread.currentThread().interrupt();\n            }\n            return \"\u0130\u015flem Tamamland\u0131\";\n        });\n\n        String result2 = future2.completeOnTimeout(\"Varsay\u0131lan De\u011fer\", 1, TimeUnit.SECONDS).get();\n        System.out.println(\"Sonu\u00e7 2: \" + result2); \/\/ \u00c7\u0131kt\u0131: Varsay\u0131lan De\u011fer\n    }\n}<\/code><\/pre>\n<h3>Process API Geli\u015ftirmeleri<\/h3>\n<p>Java 9, i\u015fletim sistemi s\u00fcre\u00e7leriyle (processes) etkile\u015fim kurmak i\u00e7in daha g\u00fc\u00e7l\u00fc ve standart bir API sunar. Bu geli\u015ftirmeler, \u00e7al\u0131\u015fan s\u00fcre\u00e7ler hakk\u0131nda bilgi almay\u0131, s\u00fcre\u00e7leri y\u00f6netmeyi ve yeni s\u00fcre\u00e7ler ba\u015flatmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>\u00d6nemli \u00d6zellikler<\/h4>\n<p>*   <strong><code>ProcessHandle<\/code>:<\/strong> \u0130\u015fletim sistemindeki bir s\u00fcreci temsil eden yeni bir aray\u00fcz.<br \/>\n*   <strong><code>ProcessHandle.current()<\/code>:<\/strong> Mevcut Java s\u00fcrecinin <code>ProcessHandle<\/code>&#8216;\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong><code>ProcessHandle.Info<\/code>:<\/strong> Bir s\u00fcre\u00e7 hakk\u0131nda (kullan\u0131c\u0131, komut, arg\u00fcmanlar, ba\u015flang\u0131\u00e7 zaman\u0131 vb.) bilgi sa\u011flayan bir aray\u00fcz.<br \/>\n*   <strong><code>onExit()<\/code>:<\/strong> Bir s\u00fcrecin sonlanmas\u0131 durumunda tetiklenecek asenkron bir eylem tan\u0131mlamak i\u00e7in <code>CompletableFuture<\/code> d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong><code>children()<\/code> ve <code>descendants()<\/code>:<\/strong> Bir s\u00fcrecin alt s\u00fcre\u00e7lerini veya t\u00fcm torunlar\u0131n\u0131 almak i\u00e7in metotlar.<\/p>\n<p><strong>\u00d6rnek:<\/strong><\/p>\n<pre><code class=\"language-java\">import java.io.IOException;\nimport java.util.Optional;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.TimeUnit;\n\npublic class ProcessApiEnhancementsExample {\n    public static void main(String[] args) throws IOException, InterruptedException {\n        \/\/ Mevcut s\u00fcrecin ProcessHandle'\u0131n\u0131 al\n        ProcessHandle currentProcess = ProcessHandle.current();\n        System.out.println(\"Mevcut S\u00fcre\u00e7 PID: \" + currentProcess.pid());\n\n        \/\/ S\u00fcre\u00e7 bilgisi al\n        ProcessHandle.Info info = currentProcess.info();\n        System.out.println(\"Kullan\u0131c\u0131: \" + info.user().orElse(\"Bilinmiyor\"));\n        System.out.println(\"Komut: \" + info.command().orElse(\"Bilinmiyor\"));\n        System.out.println(\"Ba\u015flang\u0131\u00e7 Zaman\u0131: \" + info.startInstant().orElse(null));\n        System.out.println(\"Toplam CPU S\u00fcresi: \" + info.totalCpuDuration().orElse(null));\n\n        \/\/ Yeni bir s\u00fcre\u00e7 ba\u015flat ve izle\n        ProcessBuilder pb = new ProcessBuilder(\"notepad.exe\"); \/\/ Windows i\u00e7in\n        \/\/ ProcessBuilder pb = new ProcessBuilder(\"sleep\", \"5\"); \/\/ Linux\/macOS i\u00e7in\n        Process p = pb.start();\n\n        System.out.println(\"Yeni s\u00fcre\u00e7 ba\u015flat\u0131ld\u0131, PID: \" + p.pid());\n\n        \/\/ S\u00fcre\u00e7 sonland\u0131\u011f\u0131nda bir eylem ger\u00e7ekle\u015ftir\n        CompletableFuture<ProcessHandle> onExitFuture = p.onExit();\n        onExitFuture.thenAccept(ph -> {\n            System.out.println(\"S\u00fcre\u00e7 PID \" + ph.pid() + \" sonland\u0131. \u00c7\u0131k\u0131\u015f kodu: \" + ph.exitValue().orElse(-1));\n        });\n\n        \/\/ 10 saniye bekle (notepad'i kapatman\u0131z i\u00e7in)\n        TimeUnit.SECONDS.sleep(10);\n        \n        \/\/ S\u00fcrecin hala \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol et\n        if (p.isAlive()) {\n            System.out.println(\"S\u00fcre\u00e7 hala \u00e7al\u0131\u015f\u0131yor, zorla sonland\u0131r\u0131l\u0131yor.\");\n            p.destroyForcibly(); \/\/ S\u00fcreci zorla sonland\u0131r\n        }\n        \n        \/\/ Alt s\u00fcre\u00e7leri listele (sadece \u00f6rnek, notepad'in alt s\u00fcreci olmayabilir)\n        System.out.println(\"\\nMevcut s\u00fcrecin alt s\u00fcre\u00e7leri:\");\n        currentProcess.children().forEach(child -> System.out.println(\"  Alt S\u00fcre\u00e7 PID: \" + child.pid()));\n    }\n}<\/code><\/pre>\n<h3>Multi-Release JARs (MRJARs)<\/h3>\n<p>Java 9, Multi-Release JAR (MRJAR) \u00f6zelli\u011fini tan\u0131tt\u0131. Bu, tek bir JAR dosyas\u0131n\u0131n, farkl\u0131 Java s\u00fcr\u00fcmleri i\u00e7in farkl\u0131 s\u0131n\u0131f dosyalar\u0131 i\u00e7ermesine olanak tan\u0131r. Bu sayede, k\u00fct\u00fcphane geli\u015ftiricileri, eski Java s\u00fcr\u00fcmleriyle uyumlulu\u011fu korurken, ayn\u0131 zamanda daha yeni Java s\u00fcr\u00fcmlerinin sundu\u011fu yeni \u00f6zellikleri kullanabilirler.<\/p>\n<h4>Faydalar\u0131<\/h4>\n<p>*   <strong>Geriye D\u00f6n\u00fck Uyumluluk:<\/strong> Tek bir JAR dosyas\u0131, Java 8, Java 9, Java 10 vb. gibi farkl\u0131 Java s\u00fcr\u00fcmlerinde \u00e7al\u0131\u015fabilir.<br \/>\n*   <strong>Yeni \u00d6zelliklerden Yararlanma:<\/strong> Geli\u015ftiriciler, eski s\u00fcr\u00fcmlerde \u00e7al\u0131\u015f\u0131rken yeni Java s\u00fcr\u00fcmlerinin getirdi\u011fi API&#8217;leri veya sentaks\u0131 kullanabilirler.<br \/>\n*   <strong>Da\u011f\u0131t\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Farkl\u0131 Java s\u00fcr\u00fcmleri i\u00e7in ayr\u0131 JAR dosyalar\u0131 olu\u015fturmaya ve y\u00f6netmeye gerek kalmaz.<\/p>\n<h4>\u00c7al\u0131\u015fma Prensibi<\/h4>\n<p>MRJAR&#8217;lar, <code>META-INF\/versions<\/code> dizini alt\u0131nda s\u00fcr\u00fcme \u00f6zel dizinler (\u00f6rne\u011fin, <code>META-INF\/versions\/9<\/code>, <code>META-INF\/versions\/10<\/code>) i\u00e7erir. JVM, bir s\u0131n\u0131f\u0131 y\u00fcklerken, kendi s\u00fcr\u00fcm\u00fcne en uygun olan s\u0131n\u0131f dosyas\u0131n\u0131 bu dizinlerden bulmaya \u00e7al\u0131\u015f\u0131r. E\u011fer s\u00fcr\u00fcme \u00f6zel bir s\u0131n\u0131f bulunamazsa, k\u00f6k dizindeki (base) s\u0131n\u0131f kullan\u0131l\u0131r.<\/p>\n<p><strong>\u00d6rnek Yap\u0131:<\/strong><\/p>\n<pre><code class=\"language-\">my-library.jar\n\u251c\u2500\u2500 com\/example\/MyClass.class        (Java 8 uyumlu versiyon)\n\u251c\u2500\u2500 META-INF\/\n\u2502   \u251c\u2500\u2500 MANIFEST.MF\n\u2502   \u2514\u2500\u2500 versions\/\n\u2502       \u2514\u2500\u2500 9\/\n\u2502           \u2514\u2500\u2500 com\/example\/MyClass.class (Java 9'a \u00f6zel versiyon)\n\u2502           \u2514\u2500\u2500 com\/example\/Java9SpecificClass.class (Sadece Java 9'da olan yeni s\u0131n\u0131f)<\/code><\/pre>\n<p>E\u011fer bu JAR Java 8&#8217;de \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rsa, <code>com\/example\/MyClass.class<\/code> (k\u00f6k dizindeki) y\u00fcklenecektir. E\u011fer Java 9&#8217;da \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rsa, <code>META-INF\/versions\/9\/com\/example\/MyClass.class<\/code> y\u00fcklenecektir.<\/p>\n<h3>Di\u011fer \u00d6nemli \u00d6zellikler ve Geli\u015ftirmeler<\/h3>\n<h4>Geli\u015fmi\u015f <code>@Deprecated<\/code> Anotasyonu<\/h4>\n<p>Java 9, <code>@Deprecated<\/code> anotasyonuna iki yeni eleman ekledi:<br \/>\n*   <code>forRemoval=true<\/code>: Bu eleman, API&#8217;nin gelecekteki bir s\u00fcr\u00fcmde tamamen kald\u0131r\u0131laca\u011f\u0131n\u0131 belirtir. Geli\u015ftiricilere API&#8217;yi kullanmay\u0131 b\u0131rakmalar\u0131 i\u00e7in net bir sinyal verir.<br \/>\n*   <code>since=\"versiyon\"<\/code>: Bu eleman, API&#8217;nin hangi s\u00fcr\u00fcmden itibaren kullan\u0131mdan kald\u0131r\u0131ld\u0131\u011f\u0131n\u0131 belirtir.<\/p>\n<p><strong>\u00d6rnek:<\/strong><\/p>\n<pre><code class=\"language-java\">@Deprecated(forRemoval = true, since = \"9\")\npublic class OldUtility {\n    public void doSomethingOld() {\n        System.out.println(\"Bu metot gelecekte kald\u0131r\u0131lacak.\");\n    }\n}<\/code><\/pre>\n<p>Bu, geli\u015ftiricilerin kod tabanlar\u0131n\u0131 daha proaktif bir \u015fekilde g\u00fcncellemelerine yard\u0131mc\u0131 olur.<\/p>\n<h4>Unified JVM Logging<\/h4>\n<p>Java 9, JVM&#8217;nin t\u00fcm bile\u015fenlerinden gelen log mesajlar\u0131n\u0131 tek, standart ve yap\u0131land\u0131r\u0131labilir bir sistem alt\u0131nda birle\u015ftirdi. Bu, JVM&#8217;nin i\u00e7 i\u015fleyi\u015fini izlemeyi ve hata ay\u0131klamay\u0131 \u00e7ok daha kolay hale getirir. <code>-Xlog<\/code> komut sat\u0131r\u0131 arg\u00fcman\u0131 ile loglama seviyeleri, \u00e7\u0131kt\u0131 hedefleri ve log i\u00e7eri\u011fi detayl\u0131 bir \u015fekilde yap\u0131land\u0131r\u0131labilir.<\/p>\n<h4>Spin-Wait Hints<\/h4>\n<p>Bu \u00f6zellik, me\u015fgul bekleyen (spin-wait) d\u00f6ng\u00fclerinde i\u015flemciye performans ipu\u00e7lar\u0131 sa\u011flamak i\u00e7in <code>Thread.onSpinWait()<\/code> metodunu sunar. Bu, d\u00fc\u015f\u00fck seviyeli e\u015fzamanl\u0131l\u0131k mekanizmalar\u0131n\u0131n performans\u0131n\u0131 iyile\u015ftirmeye yard\u0131mc\u0131 olabilir.<\/p>\n<h4>Segmented Code Cache<\/h4>\n<p>JVM&#8217;nin kod \u00f6nbelle\u011fi, farkl\u0131 t\u00fcrdeki derlenmi\u015f kodlar\u0131 (\u00f6rne\u011fin, non-profiled, profiled, non-method) ayr\u0131 segmentlerde depolamak \u00fczere yeniden yap\u0131land\u0131r\u0131ld\u0131. Bu, kod \u00f6nbelle\u011fi kullan\u0131m\u0131n\u0131 optimize eder ve performans\u0131 art\u0131r\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Java 9, \u00f6zellikle Java Platform Mod\u00fcl Sistemi (JPMS) ile Java ekosisteminde k\u00f6kl\u00fc bir d\u00f6n\u00fc\u015f\u00fcm ba\u015flatt\u0131. Mod\u00fclerlik, sadece JDK&#8217;n\u0131n kendisini de\u011fil, ayn\u0131 zamanda b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar\u0131n geli\u015ftirilme ve da\u011f\u0131t\u0131lma \u015feklini de derinden etkiledi. JShell gibi geli\u015ftirici verimlili\u011fini art\u0131ran ara\u00e7lar, HTTP\/2 istemcisi gibi modern a\u011f ileti\u015fimi yetenekleri, koleksiyon fabrika metotlar\u0131 ve Stream\/Optional\/CompletableFuture API&#8217;lerindeki iyile\u015ftirmeler, Java 9&#8217;u geli\u015ftiriciler i\u00e7in heyecan verici ve g\u00fc\u00e7l\u00fc bir s\u00fcr\u00fcm haline getirdi.<\/p>\n<p>Bu \u00f6zellikler, Java&#8217;n\u0131n gelecekteki b\u00fcy\u00fcmesi ve modern yaz\u0131l\u0131m geli\u015ftirme ihtiya\u00e7lar\u0131na uyum sa\u011flamas\u0131 i\u00e7in sa\u011flam bir temel olu\u015fturdu. Java 9&#8217;un getirdi\u011fi yenilikler, daha g\u00fcvenli, daha performansl\u0131 ve daha y\u00f6netilebilir Java uygulamalar\u0131 olu\u015fturman\u0131n yolunu a\u00e7arken, geli\u015ftiricilere de daha verimli ve keyifli bir deneyim sunmaktad\u0131r. Java ekosistemi, bu yeniliklerle birlikte daha da dinamik bir yap\u0131ya b\u00fcr\u00fcnm\u00fc\u015f ve gelecekteki geli\u015fmelere zemin haz\u0131rlam\u0131\u015ft\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m Java, y\u0131llar i\u00e7inde s\u00fcrekli geli\u015ferek yaz\u0131l\u0131m d\u00fcnyas\u0131n\u0131n en k\u00f6kl\u00fc ve yayg\u0131n dillerinden biri olmu\u015ftur.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-41028","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m\" \/>\n<meta property=\"og:description\" content=\"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m Java, y\u0131llar i\u00e7inde s\u00fcrekli geli\u015ferek yaz\u0131l\u0131m d\u00fcnyas\u0131n\u0131n en k\u00f6kl\u00fc ve yayg\u0131n dillerinden biri olmu\u015ftur.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-02T20:40:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m\",\"datePublished\":\"2026-03-02T20:40:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\"},\"wordCount\":2525,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\",\"name\":\"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-03-02T20:40:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/","og_locale":"tr_TR","og_type":"article","og_title":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m","og_description":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m Java, y\u0131llar i\u00e7inde s\u00fcrekli geli\u015ferek yaz\u0131l\u0131m d\u00fcnyas\u0131n\u0131n en k\u00f6kl\u00fc ve yayg\u0131n dillerinden biri olmu\u015ftur.","og_url":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-03-02T20:40:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m","datePublished":"2026-03-02T20:40:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/"},"wordCount":2525,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/","url":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/","name":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-03-02T20:40:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-9-ozellikleri-ve-ornekleri-moduler-bir-gelecege-adim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java 9 \u00d6zellikleri ve \u00d6rnekleri: Mod\u00fcler Bir Gelece\u011fe Ad\u0131m"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=41028"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41028\/revisions"}],"predecessor-version":[{"id":41029,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41028\/revisions\/41029"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}