{"id":40222,"date":"2026-02-25T13:00:45","date_gmt":"2026-02-25T10:00:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/"},"modified":"2026-02-25T13:00:45","modified_gmt":"2026-02-25T10:00:45","slug":"java-record-compact-constructorlar-yapicilari-geri-kazanmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/","title":{"rendered":"Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak"},"content":{"rendered":"<h2>Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak<\/h2>\n<p>Java 16 ile hayat\u0131m\u0131za giren Record&#8217;lar, veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar yazma bi\u00e7imimizi k\u00f6kten de\u011fi\u015ftirdi. Geleneksel olarak, veri tutan s\u0131n\u0131flar i\u00e7in boilerplate kod yazmak zorunda kal\u0131rd\u0131k: yap\u0131c\u0131lar, <code>equals()<\/code>, <code>hashCode()<\/code>, <code>toString()<\/code> metodlar\u0131, getter&#8217;lar&#8230; Record&#8217;lar t\u00fcm bu y\u00fck\u00fc \u00fczerimizden alarak kodumuzu sadele\u015ftirdi. Ancak Record&#8217;lar, veri do\u011frulama gibi kritik operasyonlar i\u00e7in \u00f6zel bir yap\u0131ya, yani &#8220;Compact Constructor&#8221;lara ihtiya\u00e7 duyar. Bu makalede, Java Record&#8217;lar\u0131n compact constructor&#8217;lar\u0131n\u0131 detayl\u0131ca inceleyecek, ne i\u015fe yarad\u0131klar\u0131n\u0131, nas\u0131l kullan\u0131ld\u0131klar\u0131n\u0131 ve neden bu kadar de\u011ferli olduklar\u0131n\u0131 ke\u015ffedece\u011fiz.<\/p>\n<h3>Java Record&#8217;lar\u0131n Temelleri ve Neden \u0130htiya\u00e7 Duyuldu?<\/h3>\n<p>Java&#8217;da veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar olu\u015fturmak, uzun y\u0131llar boyunca geli\u015ftiriciler i\u00e7in tekrarlayan ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olmu\u015ftur. Bu s\u0131n\u0131flar genellikle sadece veri depolamak ve bu verilere eri\u015fim sa\u011flamakla y\u00fck\u00fcml\u00fcyd\u00fc, ancak bu basit g\u00f6rev i\u00e7in bile \u00f6nemli miktarda kod yazmak gerekiyordu. Java Record&#8217;lar, bu soruna zarif ve etkili bir \u00e7\u00f6z\u00fcm sunarak modern Java geli\u015ftirmesinde \u00f6nemli bir yer edinmi\u015ftir.<\/p>\n<h4>Veri Ta\u015f\u0131y\u0131c\u0131 S\u0131n\u0131flar\u0131n Zorluklar\u0131<\/h4>\n<p>Bir\u00e7ok uygulamada, sadece veri tutmak ve bu verileri immutable (de\u011fi\u015fmez) bir \u015fekilde temsil etmek i\u00e7in s\u0131n\u0131flara ihtiya\u00e7 duyar\u0131z. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ad\u0131 ve e-posta adresi gibi bilgileri i\u00e7eren bir <code>User<\/code> s\u0131n\u0131f\u0131. Geleneksel yakla\u015f\u0131mda, bu s\u0131n\u0131f\u0131 olu\u015ftururken \u015funlar\u0131 yazmak zorunda kal\u0131rd\u0131k: t\u00fcm alanlar i\u00e7in <code>private final<\/code> tan\u0131mlamalar, bir yap\u0131c\u0131 metot, her alan i\u00e7in getter metodlar\u0131, <code>equals()<\/code>, <code>hashCode()<\/code> ve <code>toString()<\/code> metodlar\u0131. Bu, nispeten basit bir veri yap\u0131s\u0131 i\u00e7in bile y\u00fczlerce sat\u0131r kod anlam\u0131na gelebilirdi ve bu kodun b\u00fcy\u00fck bir k\u0131sm\u0131 tekrarlay\u0131c\u0131yd\u0131. Bu durum, hem geli\u015ftirme s\u00fcresini uzat\u0131yor hem de bak\u0131m maliyetini art\u0131r\u0131yordu.<\/p>\n<h4>Record&#8217;lar\u0131n Tan\u0131m\u0131 ve Amac\u0131<\/h4>\n<p>Java 16 ile tan\u0131t\u0131lan Record&#8217;lar, bu &#8220;veri ta\u015f\u0131y\u0131c\u0131&#8221; s\u0131n\u0131flar\u0131 tan\u0131mlaman\u0131n daha k\u0131sa ve \u00f6z bir yolunu sunar. Bir Record, de\u011fi\u015fmez veriler i\u00e7in tasarlanm\u0131\u015f \u015feffaf bir ta\u015f\u0131y\u0131c\u0131d\u0131r. <code>record<\/code> anahtar kelimesiyle tan\u0131mlan\u0131r ve derleyici, Record&#8217;un bile\u015fenleri (alanlar\u0131) i\u00e7in otomatik olarak \u015funlar\u0131 \u00fcretir:<\/p>\n<ul>\n<li>T\u00fcm bile\u015fenleri i\u00e7eren bir &#8220;canonical constructor&#8221; (standart yap\u0131c\u0131).<\/li>\n<li>Her bile\u015fen i\u00e7in bir eri\u015fimci metot (getter yerine do\u011frudan alan ad\u0131yla eri\u015fim).<\/li>\n<li><code>equals()<\/code> ve <code>hashCode()<\/code> metodlar\u0131.<\/li>\n<li><code>toString()<\/code> metodu.<\/li>\n<\/ul>\n<p>Bu otomasyon sayesinde geli\u015ftiriciler, veri modelleme konusunda daha az boilerplate kod yazarak i\u015f mant\u0131\u011f\u0131na odaklanabilirler.<\/p>\n<h4>Basit Bir Record \u00d6rne\u011fi<\/h4>\n<p>Bir Record&#8217;un ne kadar basit oldu\u011funu g\u00f6stermek i\u00e7in klasik <code>Point<\/code> \u00f6rne\u011fini ele alal\u0131m:<\/p>\n<pre><code>\npublic record Point(int x, int y) {\n    \/\/ Record body (iste\u011fe ba\u011fl\u0131)\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu tek sat\u0131rl\u0131k tan\u0131m, <code>x<\/code> ve <code>y<\/code> koordinatlar\u0131na sahip, de\u011fi\u015fmez bir <code>Point<\/code> nesnesi olu\u015fturmak i\u00e7in gereken t\u00fcm temel i\u015flevselli\u011fi sa\u011flar. <code>new Point(10, 20)<\/code> \u015feklinde bir nesne olu\u015fturabilir, <code>point.x()<\/code> ve <code>point.y()<\/code> ile de\u011ferlerine eri\u015febiliriz. Geleneksel s\u0131n\u0131flara k\u0131yasla ne kadar az kod yazd\u0131\u011f\u0131m\u0131za dikkat edin.<\/p>\n<h3>Geleneksel Yap\u0131c\u0131lar ve S\u0131n\u0131rlamalar\u0131<\/h3>\n<p>Java'da yap\u0131c\u0131lar, bir s\u0131n\u0131f\u0131n nesnelerini ba\u015flatmak i\u00e7in kullan\u0131lan \u00f6zel metotlard\u0131r. Record'lar da dahil olmak \u00fczere her s\u0131n\u0131f\u0131n en az bir yap\u0131c\u0131s\u0131 bulunur. Ancak Record'lar\u0131n yap\u0131c\u0131lar\u0131, geleneksel s\u0131n\u0131flar\u0131n yap\u0131c\u0131lar\u0131na g\u00f6re baz\u0131 farkl\u0131l\u0131klar ve \u00f6zel kullan\u0131m senaryolar\u0131 sunar.<\/p>\n<h4>Standart Yap\u0131c\u0131 Davran\u0131\u015f\u0131<\/h4>\n<p>Geleneksel bir Java s\u0131n\u0131f\u0131nda, e\u011fer a\u00e7\u0131k\u00e7a bir yap\u0131c\u0131 tan\u0131mlamazsan\u0131z, Java derleyicisi sizin i\u00e7in ba\u011f\u0131ms\u0131z de\u011fi\u015fken almayan (no-arg) varsay\u0131lan bir yap\u0131c\u0131 olu\u015fturur. Bu yap\u0131c\u0131, \u00fcst s\u0131n\u0131f\u0131n no-arg yap\u0131c\u0131s\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r. E\u011fer parametreli bir yap\u0131c\u0131 tan\u0131mlarsan\u0131z, varsay\u0131lan no-arg yap\u0131c\u0131 otomatik olarak olu\u015fturulmaz. Yap\u0131c\u0131lar\u0131n temel amac\u0131, nesnenin durumunu ilk olu\u015fturuldu\u011funda ge\u00e7erli ve tutarl\u0131 bir hale getirmektir.<\/p>\n<h4>Parametreli Yap\u0131c\u0131lar ve <code>this()<\/code> Kullan\u0131m\u0131<\/h4>\n<p>\u00c7o\u011fu zaman, bir nesnenin ilk durumunu ayarlamak i\u00e7in parametreler alan yap\u0131c\u0131lar tan\u0131mlar\u0131z. Bu yap\u0131c\u0131lar i\u00e7inde genellikle gelen parametreleri s\u0131n\u0131f\u0131n alanlar\u0131na atar\u0131z. Bir yap\u0131c\u0131n\u0131n ba\u015fka bir yap\u0131c\u0131y\u0131 \u00e7a\u011f\u0131rmas\u0131 gerekti\u011finde ise <code>this()<\/code> anahtar kelimesini kullan\u0131r\u0131z. Bu, yap\u0131c\u0131 zincirleme olarak bilinir ve kod tekrar\u0131n\u0131 azaltmak i\u00e7in faydal\u0131d\u0131r. Ancak, <code>this()<\/code> \u00e7a\u011fr\u0131s\u0131 her zaman yap\u0131c\u0131n\u0131n ilk ifadesi olmak zorundad\u0131r.<\/p>\n<pre><code>\npublic class TraditionalUser {\n    private final String name;\n    private final String email;\n\n    public TraditionalUser(String name, String email) {\n        if (name == null || name.isEmpty()) {\n            throw new IllegalArgumentException(\"Name cannot be null or empty\");\n        }\n        this.name = name;\n        this.email = email;\n    }\n\n    public TraditionalUser(String name) {\n        this(name, \"default@example.com\"); \/\/ this() ile zincirleme\n    }\n\n    \/\/ getters, equals, hashCode, toString...\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Record'larda Geleneksel Yap\u0131c\u0131lar\u0131n Durumu<\/h4>\n<p>Record'lar, derleyici taraf\u0131ndan otomatik olarak \u00fcretilen bir \"canonical constructor\"a sahiptir. Bu yap\u0131c\u0131, Record'un t\u00fcm bile\u015fenlerini (alanlar\u0131n\u0131) parametre olarak al\u0131r ve bu parametreleri do\u011frudan ilgili alanlara atar. Geleneksel s\u0131n\u0131flar\u0131n aksine, Record'larda varsay\u0131lan bir no-arg yap\u0131c\u0131 bulunmaz \u00e7\u00fcnk\u00fc Record'lar her zaman t\u00fcm bile\u015fenleriyle ba\u015flat\u0131lmal\u0131d\u0131r.<\/p>\n<p>Record'larda geleneksel yap\u0131c\u0131lar tan\u0131mlamak m\u00fcmk\u00fcnd\u00fcr, ancak bunlar her zaman ya Record'un canonical constructor'\u0131n\u0131 (veya compact constructor'\u0131n\u0131) \u00e7a\u011f\u0131rmak zorundad\u0131r ya da di\u011fer bir Record yap\u0131c\u0131y\u0131 zincirleme olarak \u00e7a\u011f\u0131rmal\u0131d\u0131r. Bu, Record'un de\u011fi\u015fmezlik ilkesini ve bile\u015fenlerinin do\u011fru \u015fekilde ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flamak i\u00e7in kritik bir k\u0131s\u0131tlamad\u0131r. Bu k\u0131s\u0131tlama, Record'lar\u0131n veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruma konusunda ne kadar kararl\u0131 oldu\u011funu g\u00f6sterir.<\/p>\n<h3>Compact Constructor Nedir?<\/h3>\n<p>Java Record'lar ile birlikte gelen en g\u00fc\u00e7l\u00fc \u00f6zelliklerden biri de \"Compact Constructor\"lard\u0131r. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, bu yap\u0131c\u0131lar standart yap\u0131c\u0131lar\u0131n daha k\u0131sa, daha yo\u011fun bir formudur ve \u00f6zellikle veri do\u011frulama gibi g\u00f6revler i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h4>S\u00f6zdizimi ve Temel Yap\u0131<\/h4>\n<p>Compact constructor, Record'un t\u00fcm bile\u015fenlerini parametre olarak almas\u0131na ra\u011fmen, bu parametreleri a\u00e7\u0131k\u00e7a bildirmek zorunda kalmad\u0131\u011f\u0131m\u0131z \u00f6zel bir yap\u0131c\u0131 t\u00fcr\u00fcd\u00fcr. S\u00f6zdizimi, Record'un ad\u0131n\u0131 al\u0131r, ancak parantez i\u00e7inde parametre listesi bulunmaz. \u0130\u00e7erisinde, parametrelerin alanlara atanmas\u0131 (yani <code>this.x = x;<\/code> gibi ifadeler) otomatik olarak derleyici taraf\u0131ndan yap\u0131l\u0131r. Geli\u015ftirici sadece do\u011frulama veya normalle\u015ftirme mant\u0131\u011f\u0131n\u0131 yazar.<\/p>\n<pre><code>\npublic record Product(String name, double price) {\n    \/\/ Compact Constructor\n    public Product {\n        if (name == null || name.isBlank()) {\n            throw new IllegalArgumentException(\"Product name cannot be null or blank.\");\n        }\n        if (price <= 0) {\n            throw new IllegalArgumentException(\"Product price must be positive.\");\n        }\n        \/\/ name ve price alanlar\u0131na atama derleyici taraf\u0131ndan otomatik yap\u0131l\u0131r.\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>Product<\/code> Record'u i\u00e7in bir compact constructor tan\u0131mlad\u0131k. Bu constructor i\u00e7inde <code>name<\/code> ve <code>price<\/code> parametrelerinin ge\u00e7erlili\u011fini kontrol ediyoruz. E\u011fer bir hata varsa <code>IllegalArgumentException<\/code> f\u0131rlat\u0131yoruz. Dikkat ederseniz, <code>this.name = name;<\/code> veya <code>this.price = price;<\/code> gibi atama ifadeleri yazmad\u0131k. Bu, compact constructor'\u0131n temel \u00f6zelli\u011fidir.<\/p>\n<h4>Canonical Constructor ile Fark\u0131<\/h4>\n<p>Her Record, derleyici taraf\u0131ndan otomatik olarak \u00fcretilen bir \"canonical constructor\"a sahiptir. Bu yap\u0131c\u0131, Record'un t\u00fcm bile\u015fenlerini parametre olarak al\u0131r ve bu parametreleri do\u011frudan ilgili alanlara atar. \u00d6rne\u011fin, <code>Product(String name, double price)<\/code> Record'u i\u00e7in derleyici \u015fu canonical constructor'\u0131 \u00fcretir:<\/p>\n<pre><code>\n\/\/ Derleyici taraf\u0131ndan \u00fcretilen canonical constructor (mant\u0131ksal olarak)\npublic Product(String name, double price) {\n    this.name = name;\n    this.price = price;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Compact constructor ise, bu canonical constructor'\u0131n bir \u00f6n i\u015fleme ad\u0131m\u0131 gibidir. Compact constructor i\u00e7inde yazd\u0131\u011f\u0131n\u0131z kod, derleyici taraf\u0131ndan \u00fcretilen canonical constructor'\u0131n alan atamalar\u0131ndan *\u00f6nce* \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Yani, compact constructor'\u0131n bitiminde, derleyici otomatik olarak parametreleri ilgili alanlara atar. Bu, compact constructor'\u0131 \u00f6zellikle veri do\u011frulama, normalle\u015ftirme veya t\u00fcretilmi\u015f alanlar\u0131 hesaplama i\u00e7in ideal k\u0131lar.<\/p>\n<h4>Implicit Alan Atamas\u0131<\/h4>\n<p>Compact constructor'\u0131n en \u00f6nemli \u00f6zelli\u011fi, parametrelerin Record bile\u015fenlerine (alanlar\u0131na) otomatik olarak atanmas\u0131d\u0131r. Geli\u015ftiricinin <code>this.field = field;<\/code> gibi ifadeler yazmas\u0131na gerek kalmaz. Bu, kod tekrar\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r ve Record'lar\u0131n ana felsefesine, yani \"az kodla \u00e7ok i\u015f yapma\"ya uygun bir yakla\u015f\u0131md\u0131r. Atama i\u015flemi, compact constructor'\u0131n kod blo\u011fu tamamland\u0131ktan hemen sonra ger\u00e7ekle\u015fir. Bu sayede, constructor i\u00e7inde do\u011frulama veya manip\u00fclasyon yapabilir, ancak alan atama sorumlulu\u011funu derleyiciye b\u0131rakabilirsiniz. Bu durum, Record'lar\u0131n de\u011fi\u015fmezlik garantisini ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruma yetene\u011fini g\u00fc\u00e7lendirir.<\/p>\n<h3>Compact Constructor Kullan\u0131m Senaryolar\u0131 ve Avantajlar\u0131<\/h3>\n<p>Compact constructor'lar, Record'lar\u0131n g\u00fcc\u00fcn\u00fc art\u0131ran ve geli\u015ftiricilere daha temiz, g\u00fcvenli kod yazma imkan\u0131 sunan \u00e7ok y\u00f6nl\u00fc bir \u00f6zelliktir. \u00d6zellikle veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak ve kod tekrar\u0131n\u0131 azaltmak i\u00e7in idealdir.<\/p>\n<h4>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc Sa\u011flama<\/h4>\n<p>Bir Record nesnesi olu\u015fturuldu\u011funda, i\u00e7erdi\u011fi verilerin belirli kurallara uymas\u0131 gerekebilir. \u00d6rne\u011fin, bir ya\u015f\u0131n negatif olmamas\u0131, bir e-posta adresinin ge\u00e7erli bir formatta olmas\u0131 veya bir fiyat\u0131n s\u0131f\u0131rdan b\u00fcy\u00fck olmas\u0131 gibi. Compact constructor'lar, bu t\u00fcr \u00f6n ko\u015ful kontrollerini do\u011frudan nesne olu\u015fturma a\u015famas\u0131nda yapmam\u0131z\u0131 sa\u011flar. Bu sayede, uygulama i\u00e7inde ge\u00e7ersiz bir Record nesnesinin olu\u015fmas\u0131n\u0131 engelleyerek veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc garanti alt\u0131na al\u0131r\u0131z. E\u011fer do\u011frulama ba\u015far\u0131s\u0131z olursa, bir <code>IllegalArgumentException<\/code> f\u0131rlatarak durumu a\u00e7\u0131k\u00e7a belirtiriz. Bu yakla\u015f\u0131m, nesnenin her zaman ge\u00e7erli bir durumda olmas\u0131n\u0131 sa\u011flar ve daha sonraki kodda ge\u00e7ersiz verilerle u\u011fra\u015fma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<pre><code>\npublic record Person(String name, int age) {\n    public Person {\n        if (name == null || name.isBlank()) {\n            throw new IllegalArgumentException(\"Name cannot be null or blank.\");\n        }\n        if (age <= 0) {\n            throw new IllegalArgumentException(\"Age must be positive.\");\n        }\n        \/\/ name = name.trim(); \/\/ Normalle\u015ftirme de yap\u0131labilir\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Gereksiz Kod Tekrar\u0131n\u0131 Azaltma<\/h4>\n<p>Geleneksel s\u0131n\u0131flarda, veri do\u011frulama mant\u0131\u011f\u0131n\u0131 birden fazla yap\u0131c\u0131da veya hatta farkl\u0131 metotlarda tekrarlamak zorunda kalabilirdik. Compact constructor, bu do\u011frulama mant\u0131\u011f\u0131n\u0131 tek bir merkezi yerde, yani Record'un yap\u0131c\u0131 a\u015famas\u0131nda toplar. Record'un canonical constructor'\u0131 (derleyici taraf\u0131ndan \u00fcretilen) her zaman bu compact constructor'\u0131 \u00e7a\u011f\u0131raca\u011f\u0131 i\u00e7in, do\u011frulama mant\u0131\u011f\u0131n\u0131n her zaman \u00e7al\u0131\u015faca\u011f\u0131ndan emin olabiliriz. Bu, kod tekrar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, <code>this.field = field;<\/code> gibi alan atama ifadelerinin derleyici taraf\u0131ndan otomatik olarak halledilmesi de kod kalabal\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/p>\n<h4>Kod Okunabilirli\u011fini Art\u0131rma<\/h4>\n<p>Compact constructor'lar, Record'un temel amac\u0131n\u0131 (veri ta\u015f\u0131ma) bozmadan, veri do\u011frulama ve normalle\u015ftirme gibi yan g\u00f6revleri \u015f\u0131k bir \u015fekilde entegre etmemizi sa\u011flar. Parametre listesinin olmamas\u0131 ve otomatik alan atamas\u0131 sayesinde, yap\u0131c\u0131 blo\u011fu sadece do\u011frulama mant\u0131\u011f\u0131na odaklan\u0131r. Bu, kodu daha okunabilir ve anla\u015f\u0131l\u0131r hale getirir. Bir Record'un tan\u0131m\u0131na bakt\u0131\u011f\u0131n\u0131zda, hangi verilerin kabul edilebilir oldu\u011funu ve hangi k\u0131s\u0131tlamalara sahip oldu\u011funu hemen anlayabilirsiniz. Bu \u015feffafl\u0131k, \u00f6zellikle b\u00fcy\u00fck projelerde veya ekip \u00e7al\u0131\u015fmalar\u0131nda kodun anla\u015f\u0131lmas\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Compact Constructor ile Veri Do\u011frulama<\/h3>\n<p>Compact constructor'lar, Record nesnelerinin olu\u015fturulmas\u0131 s\u0131ras\u0131nda veri do\u011frulama yapmak i\u00e7in ideal bir mekanizma sunar. Bu sayede, immutable Record'lar\u0131n her zaman ge\u00e7erli bir durumda olmas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\n<h4>\u00d6n Ko\u015ful Kontrolleri<\/h4>\n<p>Bir Record'un bile\u015fenlerinin belirli ko\u015fullar\u0131 sa\u011flamas\u0131 gerekti\u011finde \u00f6n ko\u015ful kontrolleri yapar\u0131z. \u00d6rne\u011fin, bir metin alan\u0131n\u0131n bo\u015f olmamas\u0131 veya bir say\u0131n\u0131n belirli bir aral\u0131kta olmas\u0131 gibi. Compact constructor, bu kontrolleri nesne olu\u015fturulmadan hemen \u00f6nce ger\u00e7ekle\u015ftirmek i\u00e7in m\u00fckemmel bir yerdir. E\u011fer bir ko\u015ful sa\u011flanmazsa, genellikle <code>IllegalArgumentException<\/code> f\u0131rlatarak ge\u00e7ersiz durumu bildiririz. Bu, Record'un de\u011fi\u015fmez yap\u0131s\u0131 gere\u011fi, nesne bir kere olu\u015fturulduktan sonra durumunun de\u011fi\u015ftirilemeyece\u011fi i\u00e7in \u00f6zellikle \u00f6nemlidir.<\/p>\n<pre><code>\npublic record Task(String description, int priority) {\n    public Task {\n        if (description == null || description.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"Description cannot be null or empty.\");\n        }\n        if (priority < 1 || priority > 10) {\n            throw new IllegalArgumentException(\"Priority must be between 1 and 10.\");\n        }\n        \/\/ description = description.trim(); \/\/ Normalle\u015ftirme de burada yap\u0131labilir\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Null Kontrolleri<\/h4>\n<p>Java'da <code>NullPointerException<\/code> (NPE) yayg\u0131n bir sorundur. Compact constructor'lar, Record bile\u015fenlerinin <code>null<\/code> olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in etkili bir y\u00f6ntem sunar. E\u011fer bir bile\u015fenin <code>null<\/code> olmamas\u0131 gerekiyorsa, constructor i\u00e7inde basit bir <code>null<\/code> kontrol\u00fc yaparak bu durumu engelleyebiliriz. Bu, \u00f6zellikle Record'lar\u0131n veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruma felsefesiyle uyumludur, \u00e7\u00fcnk\u00fc <code>null<\/code> de\u011ferler genellikle beklenmedik davran\u0131\u015flara yol a\u00e7abilir.<\/p>\n<pre><code>\nimport java.util.Objects;\n\npublic record Email(String recipient, String subject, String body) {\n    public Email {\n        Objects.requireNonNull(recipient, \"Recipient cannot be null.\");\n        Objects.requireNonNull(subject, \"Subject cannot be null.\");\n        Objects.requireNonNull(body, \"Body cannot be null.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>Objects.requireNonNull()<\/code> metodu, <code>null<\/code> kontrol\u00fc yapmak ve <code>null<\/code> olmas\u0131 durumunda belirtilen mesajla bir <code>NullPointerException<\/code> f\u0131rlatmak i\u00e7in kullan\u0131\u015fl\u0131 bir yard\u0131mc\u0131d\u0131r.<\/p>\n<h4>De\u011fer Aral\u0131k Kontrolleri<\/h4>\n<p>Say\u0131sal de\u011ferler veya tarihler gibi bile\u015fenler genellikle belirli bir aral\u0131kta olmal\u0131d\u0131r. \u00d6rne\u011fin, bir \u00fcr\u00fcn\u00fcn fiyat\u0131 negatif olamaz veya bir tarih gelecekte olmal\u0131d\u0131r. Compact constructor'lar, bu t\u00fcr aral\u0131k kontrollerini kolayca uygulamam\u0131z\u0131 sa\u011flar. Bu sayede, Record nesnelerinin her zaman mant\u0131ksal olarak ge\u00e7erli de\u011ferlere sahip olmas\u0131n\u0131 garantileyebiliriz.<\/p>\n<pre><code>\npublic record Temperature(double value, String unit) {\n    public Temperature {\n        if (unit == null || unit.isBlank()) {\n            throw new IllegalArgumentException(\"Unit cannot be null or blank.\");\n        }\n        if (!unit.equalsIgnoreCase(\"C\") && !unit.equalsIgnoreCase(\"F\")) {\n            throw new IllegalArgumentException(\"Unit must be 'C' or 'F'.\");\n        }\n        \/\/ Fahrenhayt'\u0131 Celsius'a d\u00f6n\u00fc\u015ft\u00fcrme gibi normalizasyonlar da yap\u0131labilir\n        \/\/ if (unit.equalsIgnoreCase(\"F\")) {\n        \/\/     value = (value - 32) * 5 \/ 9;\n        \/\/     unit = \"C\";\n        \/\/ }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Temperature<\/code> Record'unun <code>unit<\/code> bile\u015feninin belirli de\u011ferler aras\u0131nda olmas\u0131n\u0131 sa\u011fl\u0131yoruz. Ayr\u0131ca, bu b\u00f6l\u00fcmde g\u00f6sterildi\u011fi gibi, compact constructor'lar sadece do\u011frulama i\u00e7in de\u011fil, ayn\u0131 zamanda gelen verileri normalle\u015ftirmek veya d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in de kullan\u0131labilir.<\/p>\n<h3>Compact Constructor ve Canonical Constructor \u0130li\u015fkisi<\/h3>\n<p>Compact constructor'lar, Record'lar\u0131n temel yap\u0131c\u0131 mekanizmas\u0131 olan canonical constructor ile yak\u0131ndan ili\u015fkilidir. Bu ili\u015fkiyi anlamak, Record'lar\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve compact constructor'lar\u0131n ne zaman ve neden kullan\u0131ld\u0131\u011f\u0131n\u0131 kavramak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>Canonical Constructor'\u0131n Rol\u00fc<\/h4>\n<p>Her Record i\u00e7in Java derleyicisi otomatik olarak bir \"canonical constructor\" \u00fcretir. Bu yap\u0131c\u0131, Record'un t\u00fcm bile\u015fenlerini (alanlar\u0131n\u0131) s\u0131ras\u0131yla parametre olarak al\u0131r ve bu parametreleri do\u011frudan Record'un ilgili <code>final<\/code> alanlar\u0131na atar. Bu, Record'un de\u011fi\u015fmez (immutable) do\u011fas\u0131n\u0131n temelini olu\u015fturur. \u00d6rne\u011fin, <code>record Point(int x, int y) {}<\/code> tan\u0131m\u0131 i\u00e7in derleyici, mant\u0131ksal olarak \u015f\u00f6yle bir canonical constructor olu\u015fturur:<\/p>\n<pre><code>\n\/\/ Derleyici taraf\u0131ndan \u00fcretilen canonical constructor (mant\u0131ksal olarak)\npublic Point(int x, int y) {\n    this.x = x;\n    this.y = y;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu constructor, Record nesnesinin ilk ve tek ge\u00e7erli ba\u015flatma noktas\u0131n\u0131 temsil eder. Di\u011fer t\u00fcm yap\u0131c\u0131lar (e\u011fer tan\u0131mlanm\u0131\u015fsa), do\u011frudan veya dolayl\u0131 olarak bu canonical constructor'\u0131 \u00e7a\u011f\u0131rmak zorundad\u0131r.<\/p>\n<h4>Compact Constructor'\u0131n Geni\u015fletilmi\u015f Rol\u00fc<\/h4>\n<p>Compact constructor, asl\u0131nda bu otomatik olarak \u00fcretilen canonical constructor'\u0131n bir \"\u00f6n i\u015fleme\" blo\u011fu gibidir. Compact constructor i\u00e7inde yazd\u0131\u011f\u0131n\u0131z kod, derleyici taraf\u0131ndan \u00fcretilen alan atamalar\u0131ndan *\u00f6nce* \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Yani, bir Record nesnesi olu\u015fturuldu\u011funda, s\u00fcre\u00e7 \u015fu ad\u0131mlar\u0131 izler:<br \/>\n1.  Compact constructor'\u0131n kodu \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r (veri do\u011frulama, normalle\u015ftirme vb.).<br \/>\n2.  Compact constructor'\u0131n kodu tamamland\u0131ktan sonra, derleyici otomatik olarak Record'un bile\u015fenlerini parametrelerden ilgili <code>final<\/code> alanlar\u0131na atar.<\/p>\n<p>Bu, compact constructor'\u0131 veri do\u011frulama, normalle\u015ftirme veya t\u00fcretilmi\u015f de\u011ferleri hesaplama i\u00e7in m\u00fckemmel bir yer haline getirir. Compact constructor'\u0131n parametre listesi olmamas\u0131 ve otomatik alan atamas\u0131, kodun daha k\u0131sa ve okunabilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Derleyici Davran\u0131\u015f\u0131<\/h4>\n<p>Derleyici, bir Record'da compact constructor tan\u0131mland\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fc\u011f\u00fcnde, canonical constructor'\u0131 \u015fu \u015fekilde yeniden yazar (mant\u0131ksal olarak):<\/p>\n<pre><code>\npublic record Product(String name, double price) {\n    public Product { \/\/ Compact Constructor\n        if (name == null || name.isBlank()) {\n            throw new IllegalArgumentException(\"Product name cannot be null or blank.\");\n        }\n        if (price <= 0) {\n            throw new IllegalArgumentException(\"Product price must be positive.\");\n        }\n    }\n}\n\n\/\/ Derleyici taraf\u0131ndan \u00fcretilen canonical constructor'\u0131n i\u00e7 mant\u0131\u011f\u0131 (mant\u0131ksal olarak):\n\/\/ public Product(String name, double price) {\n\/\/     \/\/ Compact constructor'\u0131n kodu buraya eklenir\n\/\/     if (name == null || name.isBlank()) {\n\/\/         throw new IllegalArgumentException(\"Product name cannot be null or blank.\");\n\/\/     }\n\/\/     if (price <= 0) {\n\/\/         throw new IllegalArgumentException(\"Product price must be positive.\");\n\/\/     }\n\/\/     \/\/ Otomatik alan atamalar\u0131\n\/\/     this.name = name;\n\/\/     this.price = price;\n\/\/ }\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, compact constructor'\u0131n kodu, nihai alan atamalar\u0131ndan \u00f6nce \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu yap\u0131, Record'lar\u0131n de\u011fi\u015fmezlik garantisini bozmadan, nesne olu\u015fturma an\u0131nda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc ve temiz bir yol sunar. Geli\u015ftirici olarak, sadece do\u011frulama veya manip\u00fclasyon mant\u0131\u011f\u0131n\u0131 yazar\u0131z; alan atama y\u00fck\u00fcn\u00fc derleyiciye b\u0131rak\u0131r\u0131z.<\/p>\n<h3>\u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>Compact constructor'lar g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, onlar\u0131 do\u011fru ve etkili bir \u015fekilde kullanmak i\u00e7in baz\u0131 iyi uygulamalar\u0131 takip etmek ve potansiyel tuzaklara dikkat etmek \u00f6nemlidir.<\/p>\n<h4>Yaln\u0131zca Gerekliyse Kullan\u0131m<\/h4>\n<p>Compact constructor'lar, Record'lar i\u00e7in veri do\u011frulama ve normalle\u015ftirme gibi \u00f6zel durumlar i\u00e7in tasarlanm\u0131\u015ft\u0131r. E\u011fer bir Record'un bile\u015fenleri \u00fczerinde herhangi bir do\u011frulama veya manip\u00fclasyon yapman\u0131za gerek yoksa, compact constructor tan\u0131mlamak gereksizdir. Bu durumda, derleyicinin otomatik olarak \u00fcretti\u011fi canonical constructor yeterli olacakt\u0131r. Gereksiz yere compact constructor kullanmak, kodu karma\u015f\u0131kla\u015ft\u0131rabilir ve Record'lar\u0131n temel sadeli\u011fini bozabilir. Her zaman \"en basit \u00e7\u00f6z\u00fcm en iyisidir\" prensibini hat\u0131rlay\u0131n.<\/p>\n<h4>Basit ve Odakl\u0131 Do\u011frulama<\/h4>\n<p>Compact constructor'lar i\u00e7inde karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 veya yan etkileri olan i\u015flemlerden ka\u00e7\u0131nmak \u00f6nemlidir. Constructor'\u0131n temel amac\u0131, nesnenin durumunu ge\u00e7erli ve tutarl\u0131 hale getirmektir. Bu nedenle, do\u011frulama mant\u0131\u011f\u0131 m\u00fcmk\u00fcn oldu\u011funca basit, anla\u015f\u0131l\u0131r ve odakl\u0131 olmal\u0131d\u0131r. A\u011f \u00e7a\u011fr\u0131lar\u0131, veritaban\u0131 i\u015flemleri veya di\u011fer d\u0131\u015f sistemlerle etkile\u015fim gibi a\u011f\u0131r operasyonlar constructor i\u00e7inde yap\u0131lmamal\u0131d\u0131r. Bu t\u00fcr i\u015flemler, nesne olu\u015fturma s\u00fcrecini yava\u015flatabilir ve test edilebilirli\u011fi zorla\u015ft\u0131rabilir. Constructor'\u0131, Record'un kendi i\u00e7indeki verilerin ge\u00e7erlili\u011fini sa\u011flamakla s\u0131n\u0131rl\u0131 tutun.<\/p>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>Compact constructor i\u00e7inde do\u011frulama ba\u015far\u0131s\u0131z oldu\u011funda, uygun bir istisna f\u0131rlatmak \u00f6nemlidir. Genellikle <code>IllegalArgumentException<\/code> veya <code>NullPointerException<\/code> gibi \u00e7al\u0131\u015fma zaman\u0131 istisnalar\u0131 kullan\u0131l\u0131r. Bu istisnalar, nesnenin ge\u00e7ersiz bir durumda olu\u015fturulmaya \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtir. \u0130stisna mesajlar\u0131 a\u00e7\u0131klay\u0131c\u0131 olmal\u0131 ve sorunun ne oldu\u011funu net bir \u015fekilde ifade etmelidir. Bu, hata ay\u0131klama s\u00fcrecini kolayla\u015ft\u0131r\u0131r ve API'nizi kullanan di\u011fer geli\u015ftiricilere yol g\u00f6sterir.<\/p>\n<pre><code>\npublic record Age(int value) {\n    public Age {\n        if (value < 0 || value > 120) {\n            throw new IllegalArgumentException(\"Age must be between 0 and 120, but was: \" + value);\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, istisna mesaj\u0131na ge\u00e7ersiz de\u011feri de ekleyerek hatan\u0131n daha kolay anla\u015f\u0131lmas\u0131n\u0131 sa\u011fl\u0131yoruz. \u0130yi bir hata y\u00f6netimi, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini art\u0131r\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Java Record'lar, veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar yazma bi\u00e7imimizde devrim yaratarak boilerplate kodu ortadan kald\u0131rm\u0131\u015f ve geli\u015ftiricilerin daha temiz, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir kodlar yazmas\u0131n\u0131 sa\u011flam\u0131\u015ft\u0131r. Bu devrimin \u00f6nemli bir par\u00e7as\u0131 da compact constructor'lard\u0131r. Compact constructor'lar, Record'lar\u0131n de\u011fi\u015fmezlik ilkesini korurken, nesne olu\u015fturma a\u015famas\u0131nda g\u00fc\u00e7l\u00fc veri do\u011frulama ve normalle\u015ftirme yetenekleri sunar.<\/p>\n<p>Compact constructor'lar sayesinde, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc garantileyebilir, gereksiz kod tekrar\u0131n\u0131 azaltabilir ve kod okunabilirli\u011fini art\u0131rabiliriz. Canonical constructor ile olan ili\u015fkisi, derleyicinin otomatik alan atamalar\u0131n\u0131 ne zaman ve nas\u0131l ger\u00e7ekle\u015ftirdi\u011fini anlamam\u0131z\u0131 sa\u011flar. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, compact constructor'lar Java uygulamalar\u0131n\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Java geli\u015ftiricileri olarak, bu modern \u00f6zelli\u011fi benimseyerek daha verimli ve hatas\u0131z veri modelleri olu\u015fturabiliriz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Compact constructor nedir ve ne zaman kullan\u0131lmal\u0131d\u0131r?<\/h4>\n<p>Compact constructor, Java Record'lar i\u00e7in \u00f6zel bir yap\u0131c\u0131 t\u00fcr\u00fcd\u00fcr. Record'un t\u00fcm bile\u015fenlerini parametre olarak al\u0131r ancak bunlar\u0131 a\u00e7\u0131k\u00e7a bildirme ihtiyac\u0131 duymazs\u0131n\u0131z. Temel olarak, Record'un alanlar\u0131na de\u011ferler atanmadan *\u00f6nce* \u00e7al\u0131\u015ft\u0131r\u0131lacak do\u011frulama, normalle\u015ftirme veya d\u00f6n\u00fc\u015ft\u00fcrme mant\u0131\u011f\u0131n\u0131 yazmak i\u00e7in kullan\u0131l\u0131r. \u00d6zellikle veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak, <code>null<\/code> kontrolleri yapmak veya de\u011fer aral\u0131klar\u0131n\u0131 kontrol etmek gerekti\u011finde kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h4>2. Compact constructor ile canonical constructor aras\u0131ndaki fark nedir?<\/h4>\n<p>Canonical constructor, Record'un t\u00fcm bile\u015fenlerini parametre olarak alan ve bu parametreleri do\u011frudan ilgili <code>final<\/code> alanlara atayan, derleyici taraf\u0131ndan otomatik olarak \u00fcretilen standart yap\u0131c\u0131d\u0131r. Compact constructor ise, bu canonical constructor'\u0131n bir \"\u00f6n i\u015fleme\" blo\u011fu gibidir. Compact constructor i\u00e7indeki kod, canonical constructor'\u0131n otomatik alan atamalar\u0131ndan *\u00f6nce* \u00e7al\u0131\u015f\u0131r. Compact constructor parametre listesi i\u00e7ermez ve alan atamalar\u0131 derleyici taraf\u0131ndan otomatik yap\u0131l\u0131r.<\/p>\n<h4>3. Compact constructor i\u00e7inde <code>this.field = field;<\/code> gibi atamalar yapabilir miyim?<\/h4>\n<p>Evet, yapabilirsiniz, ancak bu genellikle \u00f6nerilmez ve compact constructor'\u0131n ana amac\u0131na ayk\u0131r\u0131d\u0131r. Compact constructor'\u0131n temel \u00f6zelli\u011fi, alan atamalar\u0131n\u0131n derleyici taraf\u0131ndan otomatik olarak yap\u0131lmas\u0131d\u0131r. E\u011fer <code>this.field = someValue;<\/code> gibi bir atama yaparsan\u0131z, bu de\u011fer derleyicinin otomatik atamas\u0131n\u0131 ge\u00e7ersiz k\u0131lar. Genellikle compact constructor'lar sadece do\u011frulama ve normalle\u015ftirme i\u00e7in kullan\u0131l\u0131r; atama sorumlulu\u011fu derleyiciye b\u0131rak\u0131l\u0131r.<\/p>\n<h4>4. Bir Record'da birden fazla compact constructor tan\u0131mlayabilir miyim?<\/h4>\n<p>Hay\u0131r, bir Record'da yaln\u0131zca bir tane compact constructor tan\u0131mlayabilirsiniz. Compact constructor, Record'un tek canonical constructor'\u0131n\u0131n bir uzant\u0131s\u0131d\u0131r ve bu nedenle tekil olmak zorundad\u0131r. Ancak, Record'larda ba\u015fka yard\u0131mc\u0131 yap\u0131c\u0131lar (custom constructors) tan\u0131mlayabilirsiniz, ancak bu yard\u0131mc\u0131 yap\u0131c\u0131lar\u0131n her zaman compact constructor'\u0131 veya canonical constructor'\u0131 \u00e7a\u011f\u0131rmas\u0131 gerekir.<\/p>\n<h4>5. Compact constructor i\u00e7inde hangi t\u00fcr istisnalar\u0131 f\u0131rlatmal\u0131y\u0131m?<\/h4>\n<p>Genellikle <code>IllegalArgumentException<\/code> veya <code>NullPointerException<\/code> gibi \u00e7al\u0131\u015fma zaman\u0131 istisnalar\u0131 f\u0131rlat\u0131lmal\u0131d\u0131r. <code>IllegalArgumentException<\/code>, bir arg\u00fcman\u0131n ge\u00e7erli olmad\u0131\u011f\u0131 durumlar i\u00e7in uygundur (\u00f6rne\u011fin, negatif ya\u015f, bo\u015f dize). <code>NullPointerException<\/code> ise beklenen bir de\u011ferin <code>null<\/code> olmas\u0131 durumunda kullan\u0131l\u0131r. \u0130stisna mesajlar\u0131n\u0131n a\u00e7\u0131klay\u0131c\u0131 ve sorunu net bir \u015fekilde belirten bilgiler i\u00e7ermesi \u00f6nemlidir.<\/p>\n","protected":false},"excerpt":{"rendered":"Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak\nJava 16 ile hayat\u0131m\u0131za giren Record&#8217;lar, veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar yazma bi\u00e7imimizi k&#8230;","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-40222","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 Record Compact Constructor&#039;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak - 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-record-compact-constructorlar-yapicilari-geri-kazanmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java Record Compact Constructor&#039;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak\" \/>\n<meta property=\"og:description\" content=\"Java Record Compact Constructor&#039;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak Java 16 ile hayat\u0131m\u0131za giren Record&#039;lar, veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar yazma bi\u00e7imimizi k...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-25T10:00:45+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=\"6 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak\",\"datePublished\":\"2026-02-25T10:00:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/\"},\"wordCount\":3419,\"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-record-compact-constructorlar-yapicilari-geri-kazanmak\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/\",\"name\":\"Java Record Compact Constructor'lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-25T10:00:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak\"}]},{\"@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 Record Compact Constructor'lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak - 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-record-compact-constructorlar-yapicilari-geri-kazanmak\/","og_locale":"tr_TR","og_type":"article","og_title":"Java Record Compact Constructor'lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak","og_description":"Java Record Compact Constructor'lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak Java 16 ile hayat\u0131m\u0131za giren Record'lar, veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar yazma bi\u00e7imimizi k...","og_url":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-25T10:00:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"6 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak","datePublished":"2026-02-25T10:00:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/"},"wordCount":3419,"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-record-compact-constructorlar-yapicilari-geri-kazanmak\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/","url":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/","name":"Java Record Compact Constructor'lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-25T10:00:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-record-compact-constructorlar-yapicilari-geri-kazanmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java Record Compact Constructor&#8217;lar: Yap\u0131c\u0131lar\u0131 Geri Kazanmak"}]},{"@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\/40222","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=40222"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40222\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=40222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=40222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=40222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}