{"id":34708,"date":"2025-11-21T02:41:13","date_gmt":"2025-11-20T23:41:13","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34708"},"modified":"2025-11-21T02:41:13","modified_gmt":"2025-11-20T23:41:13","slug":"java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/","title":{"rendered":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m"},"content":{"rendered":"<p><body><\/p>\n<h2>Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m<\/h2>\n<p>Java geli\u015ftiricileri, y\u0131llard\u0131r sadece veri ta\u015f\u0131makla g\u00f6revli s\u0131n\u0131flar (genellikle POJO &#8211; Plain Old Java Object olarak adland\u0131r\u0131l\u0131r) yazarken tekrar eden kod (boilerplate) sorunuyla kar\u015f\u0131 kar\u015f\u0131ya kalm\u0131\u015ft\u0131r. Bu s\u0131n\u0131flar genellikle <code>equals()<\/code>, <code>hashCode()<\/code>, <code>toString()<\/code> metotlar\u0131, getter&#8217;lar, constructor&#8217;lar ve bazen setter&#8217;lar gibi standart metotlar\u0131 i\u00e7erir. Bu durum, basit bir veri yap\u0131s\u0131 tan\u0131mlamak i\u00e7in bile olduk\u00e7a fazla kod yazmay\u0131 gerektiriyordu. Java 14 ile tan\u0131t\u0131lan ve Java 16 ile standartla\u015fan Records, bu soruna zarif ve \u00f6zl\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Records, Java diline eklenen \u00f6zel bir s\u0131n\u0131f t\u00fcr\u00fcd\u00fcr ve temel amac\u0131, de\u011fi\u015fmez (immutable) veri ta\u015f\u0131y\u0131c\u0131lar\u0131 olu\u015fturmay\u0131 basitle\u015ftirmektir. Bir Record tan\u0131mlad\u0131\u011f\u0131n\u0131zda, Java Virtual Machine (JVM) sizin i\u00e7in boilerplate kodun \u00e7o\u011funu otomatik olarak \u00fcretir, bu da kodunuzu daha okunabilir, daha k\u0131sa ve daha az hataya a\u00e7\u0131k hale getirir.<\/p>\n<h3>Record S\u0131n\u0131flar\u0131na Giri\u015f ve Temel Kullan\u0131m<\/h3>\n<p>Bir Record, veri alanlar\u0131n\u0131 do\u011frudan tan\u0131mlad\u0131\u011f\u0131 ve bu alanlar i\u00e7in otomatik olarak metotlar sa\u011flad\u0131\u011f\u0131 i\u00e7in geleneksel bir s\u0131n\u0131ftan farkl\u0131d\u0131r. Bir Record&#8217;un temel deklarasyonu olduk\u00e7a basittir:<\/p>\n<pre><code class=\"language-java\">\npublic record Point(int x, int y) {}\n<\/code><\/pre>\n<p>Bu tek sat\u0131rl\u0131k kod, geleneksel bir s\u0131n\u0131fta onlarca sat\u0131r s\u00fcrecek i\u015flevi yerine getirir. <code>Point<\/code> ad\u0131nda bir Record tan\u0131mlad\u0131k ve bu Record&#8217;un <code>x<\/code> ve <code>y<\/code> ad\u0131nda iki bile\u015feni oldu\u011funu belirttik. Bu deklarasyonla birlikte, Java derleyicisi sizin i\u00e7in \u015funlar\u0131 otomatik olarak olu\u015fturur:<\/p>\n<ul>\n<li><code>x<\/code> ve <code>y<\/code> ad\u0131nda iki <code>private final<\/code> alan. Bu, Record&#8217;lar\u0131n de\u011fi\u015fmez (immutable) olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li>T\u00fcm bile\u015fenleri arg\u00fcman olarak alan bir &#8220;canonical constructor&#8221;. \u00d6rne\u011fin, <code>new Point(10, 20)<\/code>.<\/li>\n<li>T\u00fcm bile\u015fenleri i\u00e7eren mant\u0131kl\u0131 bir <code>equals()<\/code> metodu. \u0130ki <code>Point<\/code> nesnesi, <code>x<\/code> ve <code>y<\/code> de\u011ferleri ayn\u0131ysa e\u015fit kabul edilir.<\/li>\n<li>T\u00fcm bile\u015fenleri i\u00e7eren bir <code>hashCode()<\/code> metodu. Bu, <code>equals()<\/code> ile uyumlu \u00e7al\u0131\u015f\u0131r ve koleksiyonlarda (\u00f6rne\u011fin <code>HashMap<\/code>, <code>HashSet<\/code>) do\u011fru davran\u0131\u015f\u0131 sa\u011flar.<\/li>\n<li>T\u00fcm bile\u015fenlerin adlar\u0131n\u0131 ve de\u011ferlerini g\u00f6steren bilgilendirici bir <code>toString()<\/code> metodu. \u00d6rne\u011fin, <code>Point[x=10, y=20]<\/code>.<\/li>\n<li>Her bile\u015fen i\u00e7in bir eri\u015fimci (accessor) metodu. Geleneksel getter&#8217;lar gibi <code>getX()<\/code> ve <code>getY()<\/code> yerine, Record&#8217;lar bile\u015fen ad\u0131n\u0131 do\u011frudan metot ad\u0131 olarak kullan\u0131r: <code>x()<\/code> ve <code>y()<\/code>.<\/li>\n<\/ul>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-java\">\npublic record Product(String name, double price, int stock) {}\n\npublic class Main {\n    public static void main(String[] args) {\n        \/\/ Record nesnesi olu\u015fturma\n        Product laptop = new Product(\"Gaming Laptop\", 1200.00, 50);\n\n        \/\/ Bile\u015fenlere eri\u015fim\n        System.out.println(\"\u00dcr\u00fcn Ad\u0131: \" + laptop.name());\n        System.out.println(\"Fiyat: \" + laptop.price());\n        System.out.println(\"Stok: \" + laptop.stock());\n\n        \/\/ Otomatik olu\u015fturulan toString()\n        System.out.println(\"\u00dcr\u00fcn Bilgisi: \" + laptop.toString()); \/\/ \u00c7\u0131kt\u0131: Product[name=Gaming Laptop, price=1200.0, stock=50]\n\n        \/\/ Otomatik olu\u015fturulan equals() ve hashCode()\n        Product anotherLaptop = new Product(\"Gaming Laptop\", 1200.00, 50);\n        System.out.println(\"\u0130ki laptop ayn\u0131 m\u0131? \" + laptop.equals(anotherLaptop)); \/\/ \u00c7\u0131kt\u0131: true\n\n        Product desktop = new Product(\"Gaming Desktop\", 1500.00, 30);\n        System.out.println(\"Laptop ve desktop ayn\u0131 m\u0131? \" + laptop.equals(desktop)); \/\/ \u00c7\u0131kt\u0131: false\n    }\n}\n<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, sadece <code>record Product(...) {}<\/code> tan\u0131m\u0131yla, bir veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131f\u0131 i\u00e7in gerekli t\u00fcm temel i\u015flevselli\u011fi elde etmi\u015f oluyoruz.<\/p>\n<h3>Record S\u0131n\u0131flar\u0131n\u0131n \u00d6zelle\u015ftirilmesi ve Geli\u015fmi\u015f Kullan\u0131m<\/h3>\n<p>Records, basit veri ta\u015f\u0131y\u0131c\u0131lar\u0131 i\u00e7in harika olsa da, bazen ek i\u015flevsellik veya do\u011frulama (validation) eklemek isteyebilirsiniz. Records, bu t\u00fcr ihtiya\u00e7lar i\u00e7in esneklik sunar.<\/p>\n<h4>Kompakt Constructor (Compact Constructor)<\/h4>\n<p>Record&#8217;lar, bile\u015fenlerini alan otomatik bir constructor&#8217;a sahiptir (canonical constructor). Ancak, bu constructor&#8217;\u0131n davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek veya bile\u015fenleri do\u011frulamak i\u00e7in &#8220;kompakt constructor&#8221; kullanabilirsiniz. Kompakt constructor, parametre listesi olmayan bir constructor&#8217;d\u0131r ve <code>this.x = x;<\/code> gibi atamalar\u0131 manuel olarak yapman\u0131za gerek kalmaz; Java bunu sizin i\u00e7in otomatik olarak halleder.<\/p>\n<pre><code class=\"language-java\">\npublic record Range(int min, int max) {\n    \/\/ Kompakt Constructor\n    public Range {\n        if (min > max) {\n            throw new IllegalArgumentException(\"Minimum de\u011fer, maksimum de\u011ferden b\u00fcy\u00fck olamaz.\");\n        }\n        \/\/ min ve max atamalar\u0131 otomatik olarak yap\u0131l\u0131r, bu y\u00fczden burada tekrar yazmaya gerek yoktur.\n    }\n\n    \/\/ Ek bir constructor da tan\u0131mlanabilir\n    public Range(int value) {\n        this(value, value); \/\/ Canonical constructor'\u0131 \u00e7a\u011f\u0131r\u0131r\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        Range validRange = new Range(10, 20);\n        System.out.println(validRange); \/\/ \u00c7\u0131kt\u0131: Range[min=10, max=20]\n\n        try {\n            Range invalidRange = new Range(20, 10); \/\/ Hata f\u0131rlatacak\n        } catch (IllegalArgumentException e) {\n            System.err.println(\"Hata: \" + e.getMessage());\n        }\n\n        Range singleValueRange = new Range(5);\n        System.out.println(singleValueRange); \/\/ \u00c7\u0131kt\u0131: Range[min=5, max=5]\n    }\n}\n<\/code><\/pre>\n<p>Kompakt constructor, \u00f6zellikle karma\u015f\u0131k do\u011frulama mant\u0131\u011f\u0131 eklemek istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>Instance Metotlar\u0131 ve Statik \u00dcyeler<\/h4>\n<p>Records, geleneksel s\u0131n\u0131flar gibi instance metotlar\u0131 ve statik alanlar veya metotlar i\u00e7erebilir.<\/p>\n<pre><code class=\"language-java\">\npublic record Circle(Point center, double radius) {\n    \/\/ Instance metodu\n    public double area() {\n        return Math.PI <em> radius <\/em> radius;\n    }\n\n    \/\/ Statik alan\n    public static final Circle UNIT_CIRCLE = new Circle(new Point(0, 0), 1.0);\n\n    \/\/ Statik metot\n    public static Circle createWithDiameter(Point center, double diameter) {\n        return new Circle(center, diameter \/ 2);\n    }\n}\n\npublic record Point(int x, int y) {} \/\/ Point record'\u0131 daha \u00f6nce tan\u0131mlanm\u0131\u015f olmal\u0131\n\npublic class Main {\n    public static void main(String[] args) {\n        Circle myCircle = new Circle(new Point(5, 5), 3.0);\n        System.out.println(\"Dairenin alan\u0131: \" + myCircle.area());\n\n        System.out.println(\"Birim daire: \" + Circle.UNIT_CIRCLE);\n\n        Circle anotherCircle = Circle.createWithDiameter(new Point(1, 1), 10.0);\n        System.out.println(\"\u00c7ap\u0131 10 olan daire: \" + anotherCircle);\n    }\n}\n<\/code><\/pre>\n<h4>Aray\u00fcz Uygulama (Implementing Interfaces)<\/h4>\n<p>Records, t\u0131pk\u0131 geleneksel s\u0131n\u0131flar gibi aray\u00fczleri uygulayabilir. Bu, Record&#8217;lar\u0131 mevcut Java API&#8217;leriyle veya kendi aray\u00fczlerinizle entegre etmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-java\">\npublic record Person(String name, int age) implements Comparable<Person> {\n    @Override\n    public int compareTo(Person other) {\n        return Integer.compare(this.age, other.age);\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        Person alice = new Person(\"Alice\", 30);\n        Person bob = new Person(\"Bob\", 25);\n\n        System.out.println(\"Alice'in ya\u015f\u0131 Bob'dan b\u00fcy\u00fck m\u00fc? \" + (alice.compareTo(bob) > 0)); \/\/ \u00c7\u0131kt\u0131: true\n    }\n}\n<\/code><\/pre>\n<h4>Yerel Record&#8217;lar (Local Records)<\/h4>\n<p>Java 16 ile birlikte, metotlar i\u00e7inde Record&#8217;lar tan\u0131mlamak da m\u00fcmk\u00fcn hale geldi. Bu, belirli bir metot i\u00e7inde ge\u00e7ici, k\u00fc\u00e7\u00fck veri yap\u0131lar\u0131 olu\u015fturmak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r ve kodun okunabilirli\u011fini art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-java\">\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class DataProcessor {\n    public List<String> processAndFormat(List<String> rawData) {\n        \/\/ Metot i\u00e7inde tan\u0131mlanan yerel Record\n        record ParsedData(String id, String value) {}\n\n        return rawData.stream()\n                .map(line -> {\n                    String[] parts = line.split(\":\");\n                    return new ParsedData(parts[0], parts[1]);\n                })\n                .filter(pd -> pd.value().length() > 3)\n                .map(pd -> \"ID: \" + pd.id() + \", Value: \" + pd.value().toUpperCase())\n                .collect(Collectors.toList());\n    }\n\n    public static void main(String[] args) {\n        DataProcessor processor = new DataProcessor();\n        List<String> raw = List.of(\"A1:data\", \"B2:test\", \"C3:short\", \"D4:example\");\n        List<String> formatted = processor.processAndFormat(raw);\n        formatted.forEach(System.out::println);\n        \/\/ \u00c7\u0131kt\u0131:\n        \/\/ ID: A1, Value: DATA\n        \/\/ ID: B2, Value: TEST\n        \/\/ ID: D4, Value: EXAMPLE\n    }\n}\n<\/code><\/pre>\n<h3>Record S\u0131n\u0131flar\u0131 vs. Geleneksel S\u0131n\u0131flar: Ne Zaman Hangisini Kullanmal\u0131?<\/h3>\n<p>Records, Java&#8217;da veri modelleme \u015feklimizi \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirse de, her durum i\u00e7in uygun de\u011fildir. Geleneksel s\u0131n\u0131flar hala kendi yerini korumaktad\u0131r.<\/p>\n<h4>Record S\u0131n\u0131flar\u0131n\u0131n Avantajlar\u0131:<\/h4>\n<ul>\n<li><strong>Kod K\u0131sal\u0131\u011f\u0131 ve Okunabilirlik:<\/strong> Boilerplate kodu ortadan kald\u0131rarak \u00e7ok daha az kod yazman\u0131z\u0131 sa\u011flar. Bu da kodunuzu daha temiz ve anla\u015f\u0131l\u0131r hale getirir.<\/li>\n<li><strong>De\u011fi\u015fmezlik (Immutability):<\/strong> Varsay\u0131lan olarak t\u00fcm bile\u015fenler <code>final<\/code>&#8216;d\u0131r, bu da Record nesnelerinin olu\u015fturulduktan sonra durumlar\u0131n\u0131n de\u011fi\u015ftirilemeyece\u011fi anlam\u0131na gelir. Bu, \u00f6zellikle \u00e7oklu i\u015f par\u00e7ac\u0131kl\u0131 (multi-threaded) ortamlarda ve fonksiyonel programlama tarz\u0131nda hata riskini azalt\u0131r.<\/li>\n<li><strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> <code>equals()<\/code> ve <code>hashCode()<\/code> metotlar\u0131n\u0131n otomatik ve do\u011fru bir \u015fekilde olu\u015fturulmas\u0131, koleksiyonlarda (Set, Map) ve di\u011fer API&#8217;lerde beklenen davran\u0131\u015f\u0131 sa\u011flar.<\/li>\n<li><strong>Tasar\u0131m Amac\u0131 A\u00e7\u0131kl\u0131\u011f\u0131:<\/strong> Bir s\u0131n\u0131f\u0131n Record olarak tan\u0131mlanmas\u0131, o s\u0131n\u0131f\u0131n temel amac\u0131n\u0131n yaln\u0131zca veri ta\u015f\u0131mak oldu\u011funu a\u00e7\u0131k\u00e7a belirtir.<\/li>\n<li><strong>Gelecek Entegrasyonlar\u0131:<\/strong> Pattern Matching gibi yeni Java \u00f6zellikleri ile Record&#8217;lar daha da g\u00fc\u00e7l\u00fc hale gelecektir.<\/li>\n<\/ul>\n<h4>Ne Zaman Record Kullanmal\u0131?<\/h4>\n<ul>\n<li><strong>DTO&#8217;lar (Data Transfer Objects) ve POJO&#8217;lar:<\/strong> A\u011f \u00fczerinden veri transferi veya katmanlar aras\u0131nda veri ge\u00e7i\u015fi i\u00e7in.<\/li>\n<li><strong>Ge\u00e7ici Veri Yap\u0131lar\u0131:<\/strong> Bir metot i\u00e7inde veya k\u0131sa \u00f6m\u00fcrl\u00fc bir i\u015flemde kullan\u0131lan k\u00fc\u00e7\u00fck, de\u011fi\u015fmez veri koleksiyonlar\u0131.<\/li>\n<li><strong>Tuple Benzeri Yap\u0131lar:<\/strong> Belirli bir s\u0131raya sahip, ili\u015fkili birka\u00e7 de\u011feri bir arada tutmak i\u00e7in.<\/li>\n<li><strong>Fonksiyonel Programlama:<\/strong> De\u011fi\u015fmez nesneler, fonksiyonel programlama paradigmas\u0131yla do\u011fal olarak uyumludur.<\/li>\n<\/ul>\n<h4>Ne Zaman Geleneksel S\u0131n\u0131f Kullanmal\u0131?<\/h4>\n<ul>\n<li><strong>De\u011fi\u015febilir Durum (Mutable State) Gerekti\u011finde:<\/strong> Bir nesnenin \u00f6mr\u00fc boyunca durumunun de\u011fi\u015fmesi gerekiyorsa (setter metotlar\u0131 ile), geleneksel s\u0131n\u0131flar daha uygundur.<\/li>\n<li><strong>Geni\u015fletilebilirlik (Inheritance) Gerekti\u011finde:<\/strong> Record&#8217;lar \u00f6rt\u00fck olarak <code>final<\/code>&#8216;d\u0131r ve ba\u015fka bir s\u0131n\u0131f\u0131 extend edemezler (sadece <code>java.lang.Record<\/code>&#8216;dan miras al\u0131rlar). E\u011fer s\u0131n\u0131f hiyerar\u015fisi ve kal\u0131t\u0131m gerekiyorsa, geleneksel s\u0131n\u0131flar tercih edilmelidir.<\/li>\n<li><strong>A\u011f\u0131r \u0130\u015f Mant\u0131\u011f\u0131 \u0130\u00e7eren S\u0131n\u0131flar:<\/strong> Bir s\u0131n\u0131f\u0131n temel amac\u0131 sadece veri ta\u015f\u0131mak de\u011fil, ayn\u0131 zamanda karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 veya operasyonlar y\u00fcr\u00fctmekse, geleneksel s\u0131n\u0131flar daha uygun olabilir.<\/li>\n<li><strong>ORM (Object-Relational Mapping) \u00c7\u00f6z\u00fcmleri:<\/strong> JPA, Hibernate gibi ORM k\u00fct\u00fcphaneleri geleneksel s\u0131n\u0131flar\u0131n (\u00f6zellikle bo\u015f constructor ve setter&#8217;lar) varl\u0131\u011f\u0131na al\u0131\u015fk\u0131nd\u0131r. Record&#8217;lar ile ORM kullan\u0131m\u0131 hen\u00fcz tam olarak olgunla\u015fmam\u0131\u015ft\u0131r ve baz\u0131 k\u00fct\u00fcphanelerde work-around&#8217;lar gerektirebilir.<\/li>\n<\/ul>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Java Records, dilin ifade g\u00fcc\u00fcn\u00fc art\u0131ran ve geli\u015ftiricilerin g\u00fcnl\u00fck i\u015f ak\u0131\u015f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. Veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar yazma \u015feklimizi k\u00f6kten de\u011fi\u015ftirmekte, daha az kodla daha g\u00fcvenli ve okunabilir uygulamalar olu\u015fturmam\u0131za olanak tan\u0131maktad\u0131r. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, Records projelerinizin kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131racakt\u0131r.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS):<\/h4>\n<p><strong>S: Bir Record neden <code>final<\/code>&#8216;d\u0131r?<\/strong><br \/>\nC: Record&#8217;lar, de\u011fi\u015fmez veri ta\u015f\u0131y\u0131c\u0131lar\u0131 olarak tasarlanm\u0131\u015ft\u0131r. <code>final<\/code> olmas\u0131, kal\u0131t\u0131m yoluyla davran\u0131\u015f\u0131n\u0131n veya durumunun de\u011fi\u015ftirilmesini engeller ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc garanti alt\u0131na al\u0131r.<\/p>\n<p><strong>S: Bir Record, ba\u015fka bir s\u0131n\u0131f\u0131 miras alabilir mi?<\/strong><br \/>\nC: Hay\u0131r, bir Record ba\u015fka bir s\u0131n\u0131f\u0131 extend edemez. T\u00fcm Record&#8217;lar \u00f6rt\u00fck olarak <code>java.lang.Record<\/code> s\u0131n\u0131f\u0131n\u0131 extend eder.<\/p>\n<p><strong>S: Record&#8217;un alanlar\u0131n\u0131 sonradan de\u011fi\u015ftirebilir miyim?<\/strong><br \/>\nC: Hay\u0131r, Record&#8217;un t\u00fcm bile\u015fenleri <code>private final<\/code> olarak tan\u0131mlan\u0131r. Bu, olu\u015fturulduktan sonra de\u011ferlerinin de\u011fi\u015ftirilemeyece\u011fi anlam\u0131na gelir. E\u011fer de\u011fi\u015febilir bir nesneye ihtiyac\u0131n\u0131z varsa, geleneksel bir s\u0131n\u0131f kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p><strong>S: Record&#8217;lar bo\u015f bir constructor&#8217;a sahip olabilir mi?<\/strong><br \/>\nC: Hay\u0131r, Record&#8217;lar her zaman t\u00fcm bile\u015fenlerini arg\u00fcman olarak alan bir &#8220;canonical constructor&#8221;a sahiptir. Ancak, bu constructor&#8217;\u0131 kompakt constructor ile \u00f6zelle\u015ftirebilir veya ek constructor&#8217;lar tan\u0131mlayabilirsiniz (bu ek constructor&#8217;lar\u0131n canonical constructor&#8217;\u0131 \u00e7a\u011f\u0131rmas\u0131 gerekir).<\/p>\n<p><strong>S: Record&#8217;lar ORM (JPA\/Hibernate) ile nas\u0131l kullan\u0131l\u0131r?<\/strong><br \/>\nC: Record&#8217;lar\u0131n ORM ile kullan\u0131m\u0131 hala geli\u015fmekte olan bir aland\u0131r. Baz\u0131 ORM k\u00fct\u00fcphaneleri Record&#8217;lar\u0131 do\u011frudan desteklemeyebilir \u00e7\u00fcnk\u00fc genellikle bo\u015f constructor ve setter metotlar\u0131na ihtiya\u00e7 duyarlar. Baz\u0131 durumlarda <code>@Transient<\/code> anotasyonlar\u0131 ile Record i\u00e7indeki alanlar\u0131 ignore etmek veya \u00f6zel <code>AttributeConverter<\/code>&#8216;lar yazmak gerekebilir. Java 17 ve sonras\u0131 ile ORM k\u00fct\u00fcphaneleri de Record&#8217;lara daha iyi destek vermeye ba\u015flam\u0131\u015ft\u0131r, ancak yine de dikkatli olunmal\u0131d\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m\nJava geli\u015ftiricileri, y\u0131llard\u0131r sadece veri ta\u015f\u0131makla g\u00f6revli","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-34708","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 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m\" \/>\n<meta property=\"og:description\" content=\"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m Java geli\u015ftiricileri, y\u0131llard\u0131r sadece veri ta\u015f\u0131makla g\u00f6revli\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-20T23:41:13+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=\"10 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-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m\",\"datePublished\":\"2025-11-20T23:41:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\"},\"wordCount\":1453,\"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-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\",\"name\":\"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-20T23:41:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/","og_locale":"tr_TR","og_type":"article","og_title":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m","og_description":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m Java geli\u015ftiricileri, y\u0131llard\u0131r sadece veri ta\u015f\u0131makla g\u00f6revli","og_url":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-20T23:41:13+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m","datePublished":"2025-11-20T23:41:13+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/"},"wordCount":1453,"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-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/","url":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/","name":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-20T23:41:13+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-14-records-siniflari-veri-tasiyicilari-icin-yeni-bir-yaklasim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java 14 Records S\u0131n\u0131flar\u0131: Veri Ta\u015f\u0131y\u0131c\u0131lar\u0131 \u0130\u00e7in Yeni Bir Yakla\u015f\u0131m"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34708","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=34708"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34708\/revisions"}],"predecessor-version":[{"id":34709,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34708\/revisions\/34709"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}