{"id":35684,"date":"2025-12-02T17:41:01","date_gmt":"2025-12-02T14:41:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35684"},"modified":"2025-12-02T17:41:01","modified_gmt":"2025-12-02T14:41:01","slug":"java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/","title":{"rendered":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler"},"content":{"rendered":"<p><body><\/p>\n<h2>Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler<\/h2>\n<p>Java platformu, s\u00fcrekli geli\u015fen ve yenilenen bir ekosistem sunarak d\u00fcnya genelinde milyonlarca geli\u015ftiriciye hizmet vermektedir. Oracle&#8217;\u0131n alt\u0131 ayl\u0131k yay\u0131n d\u00f6ng\u00fcs\u00fc sayesinde, her yeni s\u00fcr\u00fcmde platforma \u00f6nemli iyile\u015ftirmeler ve yeni \u00f6zellikler eklenmektedir. Java 14, bu d\u00f6ng\u00fcn\u00fcn bir par\u00e7as\u0131 olarak Mart 2020&#8217;de yay\u0131nlanm\u0131\u015f ve geli\u015ftiricilere bir dizi heyecan verici yenilik sunmu\u015ftur. Bu s\u00fcr\u00fcm, \u00f6zellikle \u00f6nizleme (preview) ve ink\u00fcbat\u00f6r (incubator) a\u015famas\u0131ndaki \u00f6zellikleriyle gelecekteki Java s\u00fcr\u00fcmlerine y\u00f6n veren \u00f6nemli ad\u0131mlar atm\u0131\u015ft\u0131r.<\/p>\n<p>Java 14&#8217;\u00fcn getirdi\u011fi yenilikler aras\u0131nda geli\u015ftirici verimlili\u011fini art\u0131ran s\u00f6zdizimsel kolayl\u0131klar, JVM performans\u0131n\u0131 ve hata ay\u0131klama yeteneklerini geli\u015ftiren iyile\u015ftirmeler ve platformun genel g\u00fcvenilirli\u011fini art\u0131ran de\u011fi\u015fiklikler bulunmaktad\u0131r. Bu makalede, Java 14 ile sunulan ba\u015fl\u0131ca \u00f6zellikler ve bunlar\u0131n modern Java geli\u015ftirme \u00fczerindeki etkileri detayl\u0131 bir \u015fekilde incelenecektir.<\/p>\n<h2>Switch \u0130fadeleri (Standard)<\/h2>\n<p>Java 12 ve Java 13&#8217;te \u00f6nizleme \u00f6zelli\u011fi olarak sunulan <code>switch<\/code> ifadeleri, Java 14 ile standart bir \u00f6zellik haline gelmi\u015ftir (JEP 361). Geleneksel <code>switch<\/code> deyimi, <code>break<\/code> anahtar kelimesinin unutulmas\u0131yla ortaya \u00e7\u0131kabilen &#8220;fall-through&#8221; hatalar\u0131 ve okunabilirli\u011fi d\u00fc\u015f\u00fcren yap\u0131s\u0131yla ele\u015ftirilmekteydi. <code>switch<\/code> ifadeleri, bu sorunlar\u0131 ortadan kald\u0131rarak daha k\u0131sa, daha g\u00fcvenli ve daha esnek bir yap\u0131 sunar.<\/p>\n<p>Geleneksel <code>switch<\/code> deyimi bir ifade (statement) iken, yeni <code>switch<\/code> yap\u0131s\u0131 bir ifade (expression) olarak kullan\u0131labilir, yani bir de\u011fer d\u00f6nd\u00fcrebilir. Bu, kodu \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir. Yeni s\u00f6zdiziminde, <code>case<\/code> etiketleri <code>-><\/code> (ok) operat\u00f6r\u00fc ile birle\u015ftirilir ve her <code>case<\/code> blo\u011fu tek bir ifade, bir kod blo\u011fu veya bir <code>throw<\/code> ifadesi i\u00e7erebilir.<\/p>\n<pre><code class=\"language-java\">\/\/ Geleneksel switch deyimi\nint ay = 3;\nString mevsim;\nswitch (ay) {\n    case 1:\n    case 2:\n    case 12:\n        mevsim = \"K\u0131\u015f\";\n        break;\n    case 3:\n    case 4:\n    case 5:\n        mevsim = \"\u0130lkbahar\";\n        break;\n    case 6:\n    case 7:\n    case 8:\n        mevsim = \"Yaz\";\n        break;\n    case 9:\n    case 10:\n    case 11:\n        mevsim = \"Sonbahar\";\n        break;\n    default:\n        mevsim = \"Bilinmiyor\";\n        break;\n}\nSystem.out.println(mevsim);\n\n\/\/ Yeni switch ifadesi\nint ayYeni = 3;\nString mevsimYeni = switch (ayYeni) {\n    case 1, 2, 12 -> \"K\u0131\u015f\";\n    case 3, 4, 5 -> \"\u0130lkbahar\";\n    case 6, 7, 8 -> \"Yaz\";\n    case 9, 10, 11 -> \"Sonbahar\";\n    default -> \"Bilinmiyor\";\n};\nSystem.out.println(mevsimYeni);<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, yeni <code>switch<\/code> ifadesi \u00e7ok daha kompakt ve okunabilir bir yap\u0131 sunar. <code>break<\/code> kullanma zorunlulu\u011fu ortadan kalkt\u0131\u011f\u0131 i\u00e7in fall-through hatalar\u0131 da engellenmi\u015f olur. Ayr\u0131ca, bir <code>switch<\/code> blo\u011fundan de\u011fer d\u00f6nd\u00fcrmek i\u00e7in <code>yield<\/code> anahtar kelimesi de kullan\u0131labilir. Bu, karma\u015f\u0131k hesaplamalar\u0131n veya birden fazla ifadenin bir <code>case<\/code> blo\u011funda yer almas\u0131 gerekti\u011finde faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">int puan = 75;\nString notDurumu = switch (puan) {\n    case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 -> \"FF\";\n    case 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 -> \"DD\";\n    case 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 -> {\n        System.out.println(\"Notunuz DD'den y\u00fcksek.\");\n        yield \"CC\";\n    }\n    case 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 -> {\n        System.out.println(\"Notunuz CC'den y\u00fcksek.\");\n        yield \"BB\";\n    }\n    case 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 -> {\n        System.out.println(\"Tebrikler!\");\n        yield \"AA\";\n    }\n    default -> {\n        System.out.println(\"Ge\u00e7ersiz puan.\");\n        yield \"Ge\u00e7ersiz\";\n    }\n};\nSystem.out.println(\"Not Durumu: \" + notDurumu);<\/code><\/pre>\n<p><code>switch<\/code> ifadeleri, \u00f6zellikle enum&#8217;lar veya sabit de\u011ferlerle \u00e7al\u0131\u015f\u0131rken kodun temizli\u011fini ve g\u00fcvenli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h2>Pattern Matching for instanceof (Preview)<\/h2>\n<p>Java 14 ile \u00f6nizleme \u00f6zelli\u011fi olarak sunulan &#8220;Pattern Matching for <code>instanceof<\/code>&#8221; (JEP 305), <code>instanceof<\/code> operat\u00f6r\u00fcn\u00fcn kullan\u0131m\u0131n\u0131 basitle\u015ftirerek yayg\u0131n bir kod kal\u0131b\u0131n\u0131 ortadan kald\u0131r\u0131r. Geleneksel olarak, bir nesnenin belirli bir t\u00fcre ait olup olmad\u0131\u011f\u0131n\u0131 kontrol ettikten sonra, o nesneyi ilgili t\u00fcre d\u00f6n\u00fc\u015ft\u00fcrmek (cast etmek) ve ard\u0131ndan kullanmak gerekiyordu. Bu, \u00f6zellikle birden fazla <code>instanceof<\/code> kontrol\u00fc oldu\u011funda tekrarlayan ve hataya a\u00e7\u0131k bir yap\u0131 olu\u015fturuyordu.<\/p>\n<pre><code class=\"language-java\">\/\/ Geleneksel instanceof kullan\u0131m\u0131\nObject obj = \"Merhaba Java 14\";\nif (obj instanceof String) {\n    String s = (String) obj; \/\/ Tip d\u00f6n\u00fc\u015f\u00fcm\u00fc (cast)\n    System.out.println(s.length());\n}\n\n\/\/ Yeni Pattern Matching for instanceof\nif (obj instanceof String s) { \/\/ obj String ise, s olarak atan\u0131r\n    System.out.println(s.length());\n}<\/code><\/pre>\n<p>Yeni s\u00f6zdiziminde, <code>instanceof<\/code> operat\u00f6r\u00fc ile bir tip kontrol\u00fc yap\u0131ld\u0131\u011f\u0131nda, e\u011fer kontrol ba\u015far\u0131l\u0131 olursa, nesne otomatik olarak belirtilen tipe d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve bir &#8220;pattern de\u011fi\u015fkenine&#8221; atan\u0131r. Bu de\u011fi\u015fkenin kapsam\u0131, <code>if<\/code> blo\u011fu ile s\u0131n\u0131rl\u0131d\u0131r ve bu sayede yanl\u0131\u015fl\u0131kla ba\u015fka bir yerde kullan\u0131lmas\u0131 engellenir.<\/p>\n<p>Bu \u00f6zellik, \u00f6zellikle hiyerar\u015fik yap\u0131daki nesnelerle \u00e7al\u0131\u015f\u0131rken veya farkl\u0131 t\u00fcrlerdeki nesneleri i\u015fleyen metotlarda kodun okunabilirli\u011fini ve k\u0131sal\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. \u00d6rne\u011fin, bir <code>List<Object><\/code> i\u00e7indeki farkl\u0131 t\u00fcrleri i\u015flemek i\u00e7in:<\/p>\n<pre><code class=\"language-java\">import java.util.List;\nimport java.util.ArrayList;\n\npublic class PatternMatchingExample {\n    public static void main(String[] args) {\n        List<Object> items = new ArrayList<>();\n        items.add(\"Hello\");\n        items.add(123);\n        items.add(true);\n        items.add(45.67);\n\n        for (Object item : items) {\n            if (item instanceof String s) {\n                System.out.println(\"String: \" + s.toUpperCase());\n            } else if (item instanceof Integer i) {\n                System.out.println(\"Integer: \" + (i * 2));\n            } else if (item instanceof Boolean b) {\n                System.out.println(\"Boolean: \" + !b);\n            } else {\n                System.out.println(\"Unknown type: \" + item);\n            }\n        }\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6zellik, tip d\u00f6n\u00fc\u015f\u00fcm\u00fc (casting) ihtiyac\u0131n\u0131 ortadan kald\u0131rarak kodun daha temiz ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, gelecekteki Java s\u00fcr\u00fcmlerinde <code>switch<\/code> ifadelerine de desen e\u015fle\u015ftirme yeteneklerinin gelmesinin \u00f6n\u00fcn\u00fc a\u00e7maktad\u0131r.<\/p>\n<h2>Records (Preview)<\/h2>\n<p>Java 14 ile \u00f6nizleme \u00f6zelli\u011fi olarak sunulan &#8220;Records&#8221; (JEP 359), veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar (data carrier classes) i\u00e7in daha kompakt bir s\u00f6zdizimi sunar. Geleneksel Java&#8217;da, sadece veri tutan s\u0131n\u0131flar (\u00f6rne\u011fin DTO&#8217;lar &#8211; Data Transfer Objects) bile \u00e7ok fazla &#8220;boilerplate&#8221; kod gerektiriyordu: yap\u0131c\u0131 metotlar (constructors), eri\u015fim metotlar\u0131 (getters), <code>equals()<\/code>, <code>hashCode()<\/code> ve <code>toString()<\/code> metotlar\u0131. Bu durum, s\u0131n\u0131f\u0131n as\u0131l amac\u0131n\u0131 g\u00f6lgede b\u0131rakabiliyor ve kod tekrar\u0131na yol a\u00e7abiliyordu.<\/p>\n<p><code>record<\/code> anahtar kelimesi, bu t\u00fcr s\u0131n\u0131flar\u0131 tan\u0131mlamay\u0131 son derece basitle\u015ftirir. Bir <code>record<\/code> tan\u0131mlad\u0131\u011f\u0131n\u0131zda, derleyici otomatik olarak a\u015fa\u011f\u0131daki bile\u015fenleri olu\u015fturur:<\/p>\n<p>*   T\u00fcm bile\u015fenler i\u00e7in bir <code>private final<\/code> alan.<br \/>\n*   T\u00fcm bile\u015fenler i\u00e7in bir <code>public<\/code> eri\u015fim metodu (getter), alan ad\u0131yla ayn\u0131 ada sahip.<br \/>\n*   T\u00fcm bile\u015fenleri arg\u00fcman olarak alan bir <code>public<\/code> kanonik yap\u0131c\u0131 metot.<br \/>\n*   T\u00fcm bile\u015fenleri temel alan <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131.<br \/>\n*   T\u00fcm bile\u015fenleri i\u00e7eren bir <code>toString()<\/code> metodu.<\/p>\n<pre><code class=\"language-java\">\/\/ Geleneksel veri s\u0131n\u0131f\u0131\nclass PersonGeleneksel {\n    private final String name;\n    private final int age;\n\n    public PersonGeleneksel(String name, int age) {\n        this.name = name;\n        this.age = age;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n        PersonGeleneksel person = (PersonGeleneksel) o;\n        return age == person.age && name.equals(person.name);\n    }\n\n    @Override\n    public int hashCode() {\n        return Objects.hash(name, age);\n    }\n\n    @Override\n    public String toString() {\n        return \"PersonGeleneksel{\" +\n               \"name='\" + name + '\\'' +\n               \", age=\" + age +\n               '}';\n    }\n}\n\n\/\/ Yeni Record tan\u0131m\u0131\nrecord Person(String name, int age) {}\n\npublic class RecordExample {\n    public static void main(String[] args) {\n        PersonGeleneksel p1G = new PersonGeleneksel(\"Alice\", 30);\n        System.out.println(p1G);\n\n        Person p1 = new Person(\"Alice\", 30);\n        Person p2 = new Person(\"Bob\", 25);\n        Person p3 = new Person(\"Alice\", 30);\n\n        System.out.println(p1);        \/\/ \u00c7\u0131kt\u0131: Person[name=Alice, age=30]\n        System.out.println(p1.name()); \/\/ \u00c7\u0131kt\u0131: Alice (getter metodu)\n        System.out.println(p1.age());  \/\/ \u00c7\u0131kt\u0131: 30\n\n        System.out.println(p1.equals(p3)); \/\/ \u00c7\u0131kt\u0131: true\n        System.out.println(p1.hashCode() == p3.hashCode()); \/\/ \u00c7\u0131kt\u0131: true\n        System.out.println(p1.equals(p2)); \/\/ \u00c7\u0131kt\u0131: false\n    }\n}<\/code><\/pre>\n<p>Records, varsay\u0131lan olarak de\u011fi\u015fmez (immutable) veri yap\u0131lar\u0131d\u0131r. Alanlar <code>final<\/code> olarak tan\u0131mlan\u0131r ve setter metotlar\u0131 otomatik olarak olu\u015fturulmaz. Bu, \u00f6zellikle fonksiyonel programlama tarz\u0131n\u0131 benimseyen veya de\u011fi\u015fmez veri yap\u0131lar\u0131n\u0131n avantajlar\u0131ndan yararlanmak isteyen geli\u015ftiriciler i\u00e7in b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar.<\/p>\n<p>Records, aray\u00fczleri uygulayabilir, statik alanlar ve metotlar tan\u0131mlayabilir, hatta \u00f6rnek metotlar tan\u0131mlayabilir. Ancak, instance alanlar\u0131 (record bile\u015fenleri d\u0131\u015f\u0131nda) tan\u0131mlayamaz, di\u011fer s\u0131n\u0131flar\u0131 extend edemez ve soyut (abstract) olamaz. Bu k\u0131s\u0131tlamalar, record&#8217;lar\u0131n veri ta\u015f\u0131ma amac\u0131na odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Text Blocks (\u0130kinci \u00d6nizleme)<\/h2>\n<p>Java 13&#8217;te \u00f6nizleme olarak tan\u0131t\u0131lan &#8220;Text Blocks&#8221; (JEP 368), Java 14 ile ikinci bir \u00f6nizleme \u00f6zelli\u011fi olarak sunulmu\u015ftur. Bu \u00f6zellik, \u00e7ok sat\u0131rl\u0131 string&#8217;lerin Java&#8217;da daha kolay ve okunabilir bir \u015fekilde tan\u0131mlanmas\u0131n\u0131 sa\u011flar. Geleneksel olarak, SQL sorgular\u0131, JSON, XML veya HTML gibi \u00e7ok sat\u0131rl\u0131 metinleri Java&#8217;da olu\u015fturmak, escape karakterlerinin (<code>\\n<\/code>, <code>\\\"<\/code>) ve string birle\u015ftirme operat\u00f6r\u00fcn\u00fcn (<code>+<\/code>) yo\u011fun kullan\u0131m\u0131 nedeniyle olduk\u00e7a zahmetli ve hataya a\u00e7\u0131kt\u0131.<\/p>\n<p>Text Blocks, \u00fc\u00e7 \u00e7ift t\u0131rnak (<code>\"\"\"<\/code>) ile ba\u015flar ve biter. Bu blok i\u00e7indeki metin, herhangi bir escape karakteri kullanmadan do\u011frudan yaz\u0131labilir ve girintiler otomatik olarak y\u00f6netilir.<\/p>\n<pre><code class=\"language-java\">\/\/ Geleneksel \u00e7ok sat\u0131rl\u0131 string\nString htmlGeleneksel = \"<html>\\n\" +\n                        \"    <body>\\n\" +\n                        \"        <p>Merhaba, Java!<\/p>\\n\" +\n                        \"    <\/body>\\n\" +\n                        \"<\/html>\";\nSystem.out.println(htmlGeleneksel);\n\n\/\/ Yeni Text Block\nString htmlYeni = \"\"\"\n                  <html>\n                      <body>\n                          <p>Merhaba, Java!<\/p>\n                      <\/body>\n                  <\/html>\"\"\";\nSystem.out.println(htmlYeni);<\/code><\/pre>\n<p>Text Blocks, derleyici taraf\u0131ndan otomatik olarak girintileri ayarlar. Derleyici, kapan\u0131\u015f <code>\"\"\"<\/code> i\u015faretine g\u00f6re en soldaki girintiyi belirler ve bu girintiyi metnin geri kalan\u0131ndan kald\u0131r\u0131r. Bu, kodunuzun i\u00e7indeki girintiyi korurken, nihai string&#8217;in istenen girinti seviyesine sahip olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Text Blocks, ayr\u0131ca baz\u0131 yeni escape dizileri de sunar:<\/p>\n<p>*   <code>\\s<\/code>: Tek bir bo\u015fluk karakteri (trailing bo\u015fluklar\u0131 korumak i\u00e7in).<br \/>\n*   <code>\\<line-terminator><\/code>: Bir sat\u0131r sonunu atlar, yani iki sat\u0131r\u0131 tek bir mant\u0131ksal sat\u0131rda birle\u015ftirir.<\/p>\n<pre><code class=\"language-java\">String query = \"\"\"\n               SELECT \"EMP_ID\", \"LAST_NAME\" FROM \"EMPLOYEE\"\n               WHERE \"CITY\" = 'Istanbul'\n               ORDER BY \"EMP_ID\"\n               \"\"\";\nSystem.out.println(query);\n\nString json = \"\"\"\n              {\n                  \"name\": \"Alice\",\n                  \"age\": 30,\n                  \"city\": \"New York\"\n              }\"\"\";\nSystem.out.println(json);\n\nString multiLine = \"\"\"\n                   Bu \u00e7ok uzun bir metin,\n                   ancak bu iki sat\u0131r \\\n                   tek bir mant\u0131ksal sat\u0131r olarak birle\u015fecek.\n                   \"\"\";\nSystem.out.println(multiLine);<\/code><\/pre>\n<p>Text Blocks, \u00f6zellikle harici formatlarla (JSON, XML, SQL, HTML) \u00e7al\u0131\u015fan uygulamalarda kodun okunabilirli\u011fini ve yaz\u0131m kolayl\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h2>NullPointerException \u0130yile\u015ftirmeleri (JEP 358)<\/h2>\n<p><code>NullPointerException<\/code> (NPE), Java geli\u015ftiricilerinin en s\u0131k kar\u015f\u0131la\u015ft\u0131\u011f\u0131 ve hata ay\u0131klamas\u0131 bazen zor olabilen \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131ndan biridir. Geleneksel olarak, bir NPE mesaj\u0131 yaln\u0131zca hangi sat\u0131rda hata olu\u015ftu\u011funu belirtir, ancak o sat\u0131rdaki hangi de\u011fi\u015fkenin <code>null<\/code> oldu\u011funu g\u00f6stermez. Karma\u015f\u0131k ifadelerde veya zincirleme metot \u00e7a\u011fr\u0131lar\u0131nda bu durum, <code>null<\/code> olan referans\u0131 bulmay\u0131 zorla\u015ft\u0131rabilir.<\/p>\n<p>Java 14, bu sorunu \u00e7\u00f6zmek i\u00e7in NPE mesajlar\u0131n\u0131 daha a\u00e7\u0131klay\u0131c\u0131 hale getiren bir iyile\u015ftirme sunar. Bu \u00f6zellik, JVM&#8217;nin hata olu\u015ftu\u011funda daha fazla bilgi sa\u011flamas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-java\">\/\/ Geleneksel NPE mesaj\u0131 (Java 13 ve \u00f6ncesi)\n\/\/ Exception in thread \"main\" java.lang.NullPointerException\n\/\/     at com.example.MyApp.main(MyApp.java:7)\n\n\/\/ Java 14'teki geli\u015fmi\u015f NPE mesaj\u0131\n\/\/ Exception in thread \"main\" java.lang.NullPointerException: Cannot invoke \"String.toLowerCase()\" because \"user.name\" is null\n\/\/     at com.example.MyApp.main(MyApp.java:7)\n\nclass User {\n    String name;\n    Address address;\n\n    public User(String name, Address address) {\n        this.name = name;\n        this.address = address;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public Address getAddress() {\n        return address;\n    }\n}\n\nclass Address {\n    String street;\n\n    public Address(String street) {\n        this.street = street;\n    }\n\n    public String getStreet() {\n        return street;\n    }\n}\n\npublic class NPEImprovementExample {\n    public static void main(String[] args) {\n        User user = new User(\"Alice\", null);\n        \/\/ user.getAddress() null, bu y\u00fczden .getStreet() \u00e7a\u011fr\u0131s\u0131 NPE f\u0131rlatacak.\n        System.out.println(user.getAddress().getStreet().toLowerCase());\n    }\n}<\/code><\/pre>\n<p>Java 14&#8217;te bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, hata mesaj\u0131 <code>Cannot invoke \"Address.getStreet()\" because \"user.address\" is null<\/code> \u015feklinde daha spesifik bir bilgi sa\u011flayacakt\u0131r. Bu, geli\u015ftiricilerin <code>null<\/code> olan referans\u0131 h\u0131zla tespit etmesine ve hata ay\u0131klama s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131rmas\u0131na yard\u0131mc\u0131 olur. Bu \u00f6zellik varsay\u0131lan olarak etkindir ve <code>java.lang.NullPointerException::detailMessage<\/code> sistem \u00f6zelli\u011fi arac\u0131l\u0131\u011f\u0131yla kontrol edilebilir.<\/p>\n<h2>D\u0131\u015f Bellek Eri\u015fim API&#8217;si (Incubator)<\/h2>\n<p>&#8220;Foreign-Memory Access API&#8221; (JEP 370), Java 14 ile ink\u00fcbat\u00f6r mod\u00fcl\u00fcnde (jdk.incubator.foreign) sunulan \u00f6nemli bir \u00f6zelliktir. Bu API, Java uygulamalar\u0131n\u0131n y\u0131\u011f\u0131n d\u0131\u015f\u0131ndaki (off-heap) belle\u011fe g\u00fcvenli ve verimli bir \u015fekilde eri\u015fmesini sa\u011flar. Geleneksel olarak, Java uygulamalar\u0131 y\u0131\u011f\u0131n belle\u011fi (heap) \u00fczerinde \u00e7al\u0131\u015f\u0131r ve y\u0131\u011f\u0131n d\u0131\u015f\u0131 belle\u011fe eri\u015fim i\u00e7in <code>ByteBuffer<\/code> veya JNI (Java Native Interface) gibi mekanizmalar kullan\u0131l\u0131rd\u0131. Ancak bu yakla\u015f\u0131mlar\u0131n kendi s\u0131n\u0131rlamalar\u0131 ve karma\u015f\u0131kl\u0131klar\u0131 vard\u0131.<\/p>\n<p><code>ByteBuffer<\/code>&#8216;lar s\u0131n\u0131rl\u0131 kapasiteye sahiptir ve genellikle belle\u011fi do\u011frudan y\u00f6netmek i\u00e7in yeterli esnekli\u011fi sa\u011flamaz. JNI ise karma\u015f\u0131k, hataya a\u00e7\u0131k ve platforma ba\u011f\u0131ml\u0131 kod yazmay\u0131 gerektirir. D\u0131\u015f Bellek Eri\u015fim API&#8217;si, bu sorunlara \u00e7\u00f6z\u00fcm getirerek Java geli\u015ftiricilerine y\u0131\u011f\u0131n d\u0131\u015f\u0131 belle\u011fi do\u011frudan, g\u00fcvenli ve performant bir \u015fekilde kullanma imkan\u0131 sunar.<\/p>\n<p>Bu API&#8217;nin temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>MemorySegment<\/strong>: Belirli bir d\u0131\u015f bellek b\u00f6lgesini temsil eder. Bu b\u00f6lge, y\u0131\u011f\u0131n d\u0131\u015f\u0131 bellek, payla\u015f\u0131lan bellek veya kal\u0131c\u0131 bellek olabilir.<br \/>\n*   <strong>MemoryAddress<\/strong>: Bellek segmenti i\u00e7indeki belirli bir adresi temsil eder.<br \/>\n*   <strong>MemoryLayout<\/strong>: Bellek segmentindeki verilerin d\u00fczenini (tip, boyut, ofset) tan\u0131mlar.<\/p>\n<p>Bu API&#8217;nin kullan\u0131m alanlar\u0131 olduk\u00e7a geni\u015ftir:<\/p>\n<p>*   <strong>B\u00fcy\u00fck Veri \u0130\u015fleme<\/strong>: \u00c7ok b\u00fcy\u00fck veri k\u00fcmelerini bellekte tutmak ve i\u015flemek, ancak Java y\u0131\u011f\u0131n\u0131n\u0131n GC maliyetlerinden ka\u00e7\u0131nmak.<br \/>\n*   <strong>Serile\u015ftirme\/Deserile\u015ftirme<\/strong>: Verileri do\u011frudan d\u0131\u015f belle\u011fe yazma ve okuma, a\u011f veya disk I\/O performans\u0131n\u0131 art\u0131rma.<br \/>\n*   <strong>Native K\u00fct\u00fcphanelerle Etkile\u015fim<\/strong>: Native k\u00fct\u00fcphaneler taraf\u0131ndan ayr\u0131lan belle\u011fe do\u011frudan eri\u015fim ve veri transferi.<br \/>\n*   <strong>Payla\u015f\u0131lan Bellek<\/strong>: S\u00fcre\u00e7ler aras\u0131 ileti\u015fim i\u00e7in payla\u015f\u0131lan bellek b\u00f6lgelerini kullanma.<\/p>\n<pre><code class=\"language-java\">import jdk.incubator.foreign.MemorySegment;\nimport jdk.incubator.foreign.MemoryLayout;\nimport jdk.incubator.foreign.ValueLayout;\n\nimport java.nio.ByteBuffer;\n\npublic class ForeignMemoryAccessExample {\n    public static void main(String[] args) {\n        \/\/ 100 byte'l\u0131k bir y\u0131\u011f\u0131n d\u0131\u015f\u0131 bellek segmenti tahsis et\n        try (MemorySegment segment = MemorySegment.allocateNative(100)) {\n            \/\/ Bir int de\u011ferini belle\u011fe yaz\n            int value = 42;\n            segment.set(ValueLayout.JAVA_INT, 0, value); \/\/ Ofset 0'a yaz\n\n            \/\/ Bellekten int de\u011ferini oku\n            int readValue = segment.get(ValueLayout.JAVA_INT, 0);\n            System.out.println(\"Okunan de\u011fer: \" + readValue); \/\/ \u00c7\u0131kt\u0131: Okunan de\u011fer: 42\n\n            \/\/ Bir byte dizisini belle\u011fe yaz\n            byte[] data = \"Merhaba Java\".getBytes();\n            segment.asSlice(4, data.length).copyFrom(MemorySegment.ofArray(data));\n\n            \/\/ Bellekten byte dizisini oku\n            byte[] readData = segment.asSlice(4, data.length).toByteArray();\n            System.out.println(\"Okunan metin: \" + new String(readData)); \/\/ \u00c7\u0131kt\u0131: Okunan metin: Merhaba Java\n\n        } \/\/ segment try-with-resources ile otomatik olarak serbest b\u0131rak\u0131l\u0131r\n    }\n}<\/code><\/pre>\n<p>Bu API, Java&#8217;n\u0131n performans kritik uygulamalarda ve native kodlarla entegrasyonda daha g\u00fc\u00e7l\u00fc olmas\u0131n\u0131 sa\u011flayacak potansiyele sahiptir.<\/p>\n<h2>Packaging Tool (Incubator)<\/h2>\n<p>Java 14 ile ink\u00fcbat\u00f6r mod\u00fcl\u00fcnde (jdk.incubator.jpackage) sunulan &#8220;Packaging Tool&#8221; (JEP 343), Java uygulamalar\u0131n\u0131 platforma \u00f6zg\u00fc paketler halinde (\u00f6rne\u011fin Windows i\u00e7in MSI veya EXE, macOS i\u00e7in DMG, Linux i\u00e7in DEB veya RPM) da\u011f\u0131tmay\u0131 kolayla\u015ft\u0131ran <code>jpackage<\/code> arac\u0131n\u0131 getirmi\u015ftir. Geleneksel olarak, Java uygulamalar\u0131n\u0131 son kullan\u0131c\u0131lara da\u011f\u0131tmak, \u00f6zellikle ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve bir JVM&#8217;yi de i\u00e7erecek \u015fekilde paketlemek karma\u015f\u0131k bir s\u00fcre\u00e7ti.<\/p>\n<p><code>jpackage<\/code> arac\u0131, bir Java uygulamas\u0131n\u0131 ve onun ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (JAR dosyalar\u0131, mod\u00fcller) tek bir \u00e7al\u0131\u015ft\u0131r\u0131labilir pakette birle\u015ftirerek, son kullan\u0131c\u0131n\u0131n Java Runtime Environment (JRE) kurma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu, \u00f6zellikle masa\u00fcst\u00fc uygulamalar\u0131 i\u00e7in kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<p><code>jpackage<\/code>&#8216;\u0131n temel \u00f6zellikleri:<\/p>\n<p>*   <strong>Platforma \u00d6zg\u00fc Paketler<\/strong>: Windows (.msi, .exe), macOS (.dmg), Linux (.deb, .rpm) gibi farkl\u0131 i\u015fletim sistemleri i\u00e7in yerel paketler olu\u015fturabilir.<br \/>\n*   <strong>JRE Dahil Etme<\/strong>: Uygulama ile birlikte bir Java Runtime Environment&#8217;\u0131 (JRE) paketleyebilir, b\u00f6ylece kullan\u0131c\u0131n\u0131n sisteminde Java y\u00fckl\u00fc olup olmamas\u0131 fark etmez.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi<\/strong>: Uygulaman\u0131n t\u00fcm JAR ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 pakete dahil edebilir.<br \/>\n*   <strong>Uygulama \u0130konlar\u0131 ve Metadatalar<\/strong>: Uygulama i\u00e7in ikonlar, s\u00fcr\u00fcm bilgileri ve di\u011fer metadatalar\u0131 ayarlama imkan\u0131 sunar.<\/p>\n<p>\u00d6rnek bir <code>jpackage<\/code> komutu (basitle\u015ftirilmi\u015f):<\/p>\n<pre><code class=\"language-bash\">jpackage --input lib --main-jar myapp.jar --main-class com.example.MyMainClass --name \"MyJavaApp\" --type dmg --dest output<\/code><\/pre>\n<p>Bu komut, <code>lib<\/code> klas\u00f6r\u00fcndeki ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren <code>myapp.jar<\/code> dosyas\u0131n\u0131 kullanarak <code>com.example.MyMainClass<\/code> ana s\u0131n\u0131f\u0131na sahip &#8220;MyJavaApp&#8221; ad\u0131nda bir macOS DMG paketi olu\u015fturur ve <code>output<\/code> klas\u00f6r\u00fcne kaydeder.<\/p>\n<p>Bu ara\u00e7, Java&#8217;n\u0131n masa\u00fcst\u00fc uygulamalar\u0131 geli\u015ftirme ve da\u011f\u0131tma yeteneklerini g\u00fc\u00e7lendirerek, geli\u015ftiricilerin uygulamalar\u0131n\u0131 daha kolay bir \u015fekilde son kullan\u0131c\u0131lara ula\u015ft\u0131rmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Garbage Collector \u0130yile\u015ftirmeleri ve Kald\u0131r\u0131lanlar<\/h2>\n<p>Java 14, JVM&#8217;nin bellek y\u00f6netimi ve \u00e7\u00f6p toplama (Garbage Collection &#8211; GC) mekanizmalar\u0131nda \u00f6nemli iyile\u015ftirmeler ve baz\u0131 eski GC algoritmalar\u0131n\u0131n kald\u0131r\u0131lmas\u0131n\u0131 i\u00e7erir.<\/p>\n<h3>ZGC ve Shenandoah \u0130yile\u015ftirmeleri<\/h3>\n<p>Java&#8217;n\u0131n d\u00fc\u015f\u00fck gecikme s\u00fcreli \u00e7\u00f6p toplay\u0131c\u0131lar\u0131 olan ZGC (Z Garbage Collector) ve Shenandoah, Java 14 ile daha geni\u015f platform deste\u011fi kazanm\u0131\u015ft\u0131r.<\/p>\n<p>*   <strong>ZGC on macOS and Windows (JEP 364):<\/strong> ZGC, Linux&#8217;ta tan\u0131t\u0131ld\u0131ktan sonra Java 14 ile macOS ve Windows i\u015fletim sistemlerine de ta\u015f\u0131nm\u0131\u015ft\u0131r. Bu, geli\u015ftiricilerin bu platformlarda da ZGC&#8217;nin ultra d\u00fc\u015f\u00fck gecikme s\u00fcreli \u00e7\u00f6p toplama yeteneklerinden faydalanabilmesini sa\u011flar. ZGC, b\u00fcy\u00fck y\u0131\u011f\u0131nlara sahip uygulamalar i\u00e7in dahi duraklama s\u00fcrelerini (pause times) milisaniyelerin alt\u0131nda tutmay\u0131 hedefler.<br \/>\n*   <strong>Shenandoah on Windows:<\/strong> Benzer \u015fekilde, Shenandoah GC de Windows&#8217;a ta\u015f\u0131narak, Windows \u00fczerinde d\u00fc\u015f\u00fck gecikme s\u00fcreli GC ihtiyac\u0131 olan uygulamalara bir se\u00e7enek daha sunulmu\u015ftur.<\/p>\n<h3>G1 i\u00e7in NUMA-Aware Bellek Tahsisi (JEP 345)<\/h3>\n<p>G1 (Garbage-First) Garbage Collector, Java 14 ile NUMA (Non-Uniform Memory Access) mimarilerine daha duyarl\u0131 hale getirilmi\u015ftir. NUMA sistemlerde, i\u015flemciler belle\u011fe farkl\u0131 h\u0131zlarda eri\u015febilir (kendi yerel belle\u011fine h\u0131zl\u0131, di\u011fer i\u015flemcilerin belle\u011fine daha yava\u015f). Bu iyile\u015ftirme, G1&#8217;in bellek tahsisini ve \u00e7\u00f6p toplama i\u015flemlerini NUMA topolojisini g\u00f6z \u00f6n\u00fcnde bulundurarak yapmas\u0131n\u0131 sa\u011flar. Sonu\u00e7 olarak, NUMA mimarilerinde \u00e7al\u0131\u015fan Java uygulamalar\u0131n\u0131n performans\u0131 ve verimi art\u0131r\u0131labilir.<\/p>\n<h3>CMS ve Paralel + Seri GC Kombinasyonunun Kald\u0131r\u0131lmas\u0131 (JEP 363, JEP 366)<\/h3>\n<p>Java 14, baz\u0131 eski ve bak\u0131m\u0131 zor GC algoritmalar\u0131n\u0131 platformdan kald\u0131rma karar\u0131 alm\u0131\u015ft\u0131r:<\/p>\n<p>*   <strong>Remove the Concurrent Mark Sweep (CMS) Garbage Collector (JEP 363):<\/strong> CMS GC, d\u00fc\u015f\u00fck gecikme s\u00fcresi hedefleriyle tasarlanm\u0131\u015f eski bir \u00e7\u00f6p toplay\u0131c\u0131yd\u0131. Ancak, bak\u0131m\u0131 zorla\u015fm\u0131\u015f, karma\u015f\u0131k ve modern donan\u0131m mimarileriyle tam uyumlu de\u011fildi. Daha yeni ve daha verimli alternatifler olan ZGC ve Shenandoah&#8217;\u0131n yan\u0131 s\u0131ra, G1 de d\u00fc\u015f\u00fck gecikme s\u00fcresi hedeflerine ula\u015fmada \u00f6nemli ilerlemeler kaydetmi\u015ftir. Bu nedenle, CMS GC Java 14&#8217;te tamamen kald\u0131r\u0131lm\u0131\u015ft\u0131r.<br \/>\n*   <strong>Deprecate the ParallelScavenge + SerialOld GC Combination (JEP 366):<\/strong> <code>ParallelScavenge<\/code> ve <code>SerialOld<\/code> \u00e7\u00f6p toplay\u0131c\u0131lar\u0131n\u0131n birlikte kullan\u0131ld\u0131\u011f\u0131 kombinasyon (gen\u00e7 nesil i\u00e7in ParallelScavenge, ya\u015fl\u0131 nesil i\u00e7in SerialOld), Java 14&#8217;te kullan\u0131mdan kald\u0131r\u0131lm\u0131\u015ft\u0131r. Bu kombinasyonun kullan\u0131m\u0131 olduk\u00e7a nadirdi ve bak\u0131m maliyeti faydalar\u0131n\u0131 a\u015fmaya ba\u015flam\u0131\u015ft\u0131. Gelecekteki s\u00fcr\u00fcmlerde kald\u0131r\u0131lmas\u0131 beklenmektedir.<\/p>\n<p>Bu de\u011fi\u015fiklikler, JVM&#8217;nin GC mekanizmalar\u0131n\u0131 modernize etme, daha yeni ve daha verimli algoritmalara odaklanma stratejisinin bir par\u00e7as\u0131d\u0131r.<\/p>\n<h2>JFR Event Streaming (JEP 349)<\/h2>\n<p>Java Flight Recorder (JFR), Java uygulamalar\u0131n\u0131n ve JVM&#8217;nin \u00e7al\u0131\u015fma zaman\u0131 davran\u0131\u015f\u0131n\u0131 izlemek ve sorun gidermek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Geleneksel olarak, JFR verileri bir dosyaya kaydedilir ve daha sonra analiz edilirdi. Java 14 ile sunulan &#8220;JFR Event Streaming&#8221; (JEP 349), JFR olaylar\u0131n\u0131n canl\u0131 olarak bir API arac\u0131l\u0131\u011f\u0131yla t\u00fcketilmesine olanak tan\u0131r.<\/p>\n<p>Bu \u00f6zellik, uygulama \u00e7al\u0131\u015f\u0131rken performans verilerini, sistem olaylar\u0131n\u0131 ve di\u011fer JVM metriklerini ger\u00e7ek zamanl\u0131 olarak izlemek isteyen geli\u015ftiriciler ve operasyon ekipleri i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r. Art\u0131k JFR verilerini s\u00fcrekli olarak bir dosyaya yaz\u0131p okumaya gerek kalmadan, do\u011frudan bellek i\u00e7i ak\u0131\u015flardan i\u015flenebilir.<\/p>\n<p>JFR Event Streaming&#8217;in faydalar\u0131:<\/p>\n<p>*   <strong>Ger\u00e7ek Zamanl\u0131 \u0130zleme<\/strong>: Uygulama davran\u0131\u015f\u0131n\u0131 an\u0131nda g\u00f6zlemleme, performans sorunlar\u0131n\u0131 h\u0131zla tespit etme.<br \/>\n*   <strong>Dinamik Analiz<\/strong>: Uygulaman\u0131n performans\u0131na ve kaynak kullan\u0131m\u0131na dinamik olarak yan\u0131t veren ara\u00e7lar geli\u015ftirme.<br \/>\n*   <strong>Otomasyon<\/strong>: JFR verilerini otomatik sistemlere entegre ederek uyar\u0131lar olu\u015fturma veya otomatik eylemler tetikleme.<br \/>\n*   <strong>Daha Az Disk I\/O<\/strong>: Verileri do\u011frudan ak\u0131\u015ftan okuyarak disk yazma y\u00fck\u00fcn\u00fc azaltma.<\/p>\n<p>Bu API, <code>jdk.jfr.consumer<\/code> paketi alt\u0131nda bulunur ve geli\u015ftiricilerin kendi \u00f6zel JFR t\u00fcketicilerini yazmalar\u0131na olanak tan\u0131r.<\/p>\n<pre><code class=\"language-java\">import jdk.jfr.consumer.RecordedEvent;\nimport jdk.jfr.consumer.RecordingStream;\n\nimport java.time.Duration;\n\npublic class JfrStreamExample {\n    public static void main(String[] args) throws InterruptedException {\n        \/\/ 1 saniyelik bir kay\u0131t ak\u0131\u015f\u0131 olu\u015ftur\n        try (RecordingStream rs = new RecordingStream()) {\n            rs.enable(\"jdk.CPULoad\").withPeriod(Duration.ofSeconds(1)); \/\/ CPU y\u00fck\u00fcn\u00fc her saniye etkinle\u015ftir\n            rs.enable(\"jdk.GarbageCollection\"); \/\/ GC olaylar\u0131n\u0131 etkinle\u015ftir\n\n            rs.onEvent(\"jdk.CPULoad\", event -> {\n                System.out.println(\"CPU Y\u00fck\u00fc: \" + event.getFloat(\"machineTotal\") * 100 + \"%\");\n            });\n\n            rs.onEvent(\"jdk.GarbageCollection\", event -> {\n                String gcName = event.getString(\"name\");\n                long duration = event.getDuration().toMillis();\n                System.out.println(\"GC Olay\u0131: \" + gcName + \" - S\u00fcre: \" + duration + \" ms\");\n            });\n\n            rs.startAsync(); \/\/ Ak\u0131\u015f\u0131 asenkron olarak ba\u015flat\n\n            \/\/ Uygulaman\u0131n bir s\u00fcre \u00e7al\u0131\u015fmas\u0131na izin ver\n            Thread.sleep(10000);\n        }\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnek, CPU y\u00fck\u00fcn\u00fc ve GC olaylar\u0131n\u0131 canl\u0131 olarak dinler ve konsola yazd\u0131r\u0131r.<\/p>\n<h2>Di\u011fer \u00d6nemli \u0130yile\u015ftirmeler<\/h2>\n<p>Java 14, yukar\u0131da detayland\u0131r\u0131lan b\u00fcy\u00fck \u00f6zelliklerin yan\u0131 s\u0131ra, platformun farkl\u0131 alanlar\u0131nda bir dizi ba\u015fka iyile\u015ftirme ve de\u011fi\u015fiklik de getirmi\u015ftir.<\/p>\n<h3>Non-Volatile Mapped Byte Buffers (JEP 352)<\/h3>\n<p>Bu JEP, <code>MappedByteBuffer<\/code> i\u00e7in yeni bir mod olan <code>MAP_SYNC<\/code>&#8216;yi tan\u0131t\u0131r. Bu mod, kal\u0131c\u0131 bellek (persistent memory &#8211; NVM) \u00fczerinde \u00e7al\u0131\u015fan <code>MappedByteBuffer<\/code>&#8216;lar\u0131n verilerini do\u011frudan ve senkronize bir \u015fekilde depolama ayg\u0131t\u0131na yazmas\u0131n\u0131 sa\u011flar. Kal\u0131c\u0131 bellek, g\u00fc\u00e7 kesintilerinde bile verilerini koruyabilen yeni bir depolama teknolojisidir. Bu \u00f6zellik, Java uygulamalar\u0131n\u0131n kal\u0131c\u0131 bellekten daha verimli bir \u015fekilde yararlanmas\u0131na ve y\u00fcksek performansl\u0131, dayan\u0131kl\u0131 veri depolama \u00e7\u00f6z\u00fcmleri geli\u015ftirmesine olanak tan\u0131r.<\/p>\n<h3>Deprecation of the Solaris and SPARC Ports (JEP 362)<\/h3>\n<p>Java 14 ile Solaris\/SPARC, Solaris\/x64 ve Linux\/SPARC portlar\u0131 kullan\u0131mdan kald\u0131r\u0131lm\u0131\u015ft\u0131r. Bu, Oracle&#8217;\u0131n ve OpenJDK toplulu\u011funun bu platformlara olan deste\u011fi azaltma ve kaynaklar\u0131n\u0131 daha yayg\u0131n kullan\u0131lan platformlara (Linux, Windows, macOS) odaklama stratejisinin bir par\u00e7as\u0131d\u0131r. Bu portlar gelecekteki s\u00fcr\u00fcmlerde tamamen kald\u0131r\u0131labilir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Java 14, Java platformunun modernizasyon yolculu\u011funda \u00f6nemli bir kilometre ta\u015f\u0131d\u0131r. <code>switch<\/code> ifadelerinin standart hale gelmesi, geli\u015ftiricilere daha temiz ve g\u00fcvenli kod yazma imkan\u0131 sunarken, <code>Pattern Matching for instanceof<\/code> ve <code>Records<\/code> gibi \u00f6nizleme \u00f6zellikleri gelecekteki Java s\u00fcr\u00fcmlerinin ne kadar yenilik\u00e7i olaca\u011f\u0131n\u0131n sinyallerini vermektedir. Text Blocks, \u00e7ok sat\u0131rl\u0131 string&#8217;lerle \u00e7al\u0131\u015fmay\u0131 basitle\u015ftirirken, NullPointerException iyile\u015ftirmeleri hata ay\u0131klama s\u00fcrecini h\u0131zland\u0131rmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca, <code>Foreign-Memory Access API<\/code> ve <code>Packaging Tool<\/code> gibi ink\u00fcbat\u00f6r \u00f6zellikleri, Java&#8217;n\u0131n performans kritik alanlarda ve da\u011f\u0131t\u0131m kolayl\u0131\u011f\u0131nda daha da g\u00fc\u00e7lenece\u011fini g\u00f6stermektedir. \u00c7\u00f6p toplay\u0131c\u0131lar\u0131ndaki iyile\u015ftirmeler (ZGC ve Shenandoah&#8217;\u0131n geni\u015flemesi, G1&#8217;in NUMA fark\u0131ndal\u0131\u011f\u0131) ve eski, verimsiz GC&#8217;lerin kald\u0131r\u0131lmas\u0131, JVM&#8217;nin genel verimlili\u011fini ve kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131rmaktad\u0131r. JFR Event Streaming ise, uygulamalar\u0131n canl\u0131 izlenmesi ve analizi i\u00e7in yeni kap\u0131lar a\u00e7maktad\u0131r.<\/p>\n<p>Java 14, hem geli\u015ftirici verimlili\u011fini art\u0131ran s\u00f6zdizimsel \u015fekerler hem de platformun temel performans ve y\u00f6netim yeteneklerini geli\u015ftiren derinlemesine iyile\u015ftirmeler sunarak, modern Java geli\u015ftirmesi i\u00e7in sa\u011flam bir temel olu\u015fturmu\u015ftur. Geli\u015ftiricilerin bu yeni \u00f6zellikleri ke\u015ffetmeleri ve projelerine entegre etmeleri, daha verimli, okunabilir ve g\u00fc\u00e7l\u00fc Java uygulamalar\u0131 olu\u015fturmalar\u0131na yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler\nJava platformu, s\u00fcrekli geli\u015fen ve yenilenen bir ekosistem sunarak d\u00fcnya genelind","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-35684","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 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler - 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-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler\" \/>\n<meta property=\"og:description\" content=\"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler Java platformu, s\u00fcrekli geli\u015fen ve yenilenen bir ekosistem sunarak d\u00fcnya genelind\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T14:41:01+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-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler\",\"datePublished\":\"2025-12-02T14:41:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\"},\"wordCount\":3006,\"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-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\",\"name\":\"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-02T14:41:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler\"}]},{\"@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 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler - 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-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/","og_locale":"tr_TR","og_type":"article","og_title":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler","og_description":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler Java platformu, s\u00fcrekli geli\u015fen ve yenilenen bir ekosistem sunarak d\u00fcnya genelind","og_url":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-02T14:41:01+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-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler","datePublished":"2025-12-02T14:41:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/"},"wordCount":3006,"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-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/","url":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/","name":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-02T14:41:01+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-14-ozellikleri-modern-java-gelistirme-icin-yenilikler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java 14 \u00d6zellikleri: Modern Java Geli\u015ftirme \u0130\u00e7in Yenilikler"}]},{"@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\/35684","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=35684"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35684\/revisions"}],"predecessor-version":[{"id":35685,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35684\/revisions\/35685"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}