[{"data":1,"prerenderedAt":2301},["ShallowReactive",2],{"page-tr-\u002Fblog\u002Fjava-21-features":3,"related-tr-\u002Fblog\u002Fjava-21-features":2278},{"id":4,"title":5,"body":6,"date":2267,"description":2268,"extension":2269,"meta":2270,"navigation":467,"path":2271,"seo":2272,"stem":2273,"tags":2274,"translation":2276,"__hash__":2277},"pages_tr\u002Ftr\u002Fblog\u002Fjava-21-features.md","Java 21 Yenilikleri: Virtual Threads, Records ve Pattern Matching",{"type":7,"value":8,"toc":2254},"minimark",[9,14,18,26,53,57,60,244,247,250,338,341,359,362,397,401,416,547,550,662,669,673,683,937,940,1019,1025,1029,1032,1342,1347,1409,1413,1420,1667,1678,1682,1685,1934,1960,1964,2108,2119,2123,2130,2161,2165,2240,2244,2250],[10,11,13],"h2",{"id":12},"giriş","Giriş",[15,16,17],"p",{},"Java 21, Java 17'den sonraki LTS (uzun süreli destek) sürümüdür ve Java 11\u002F17'den geçiş yapan projeler için en çok hedeflenen sürümdür. Java 17 ile 21 arasında gelen özelliklerin bir kısmı, Java kodunu yazma şeklimizi doğrudan değiştiriyor: daha az boilerplate, daha güvenli tip kontrolü ve thread başına bir istek modelini yeniden mümkün kılan virtual thread'ler.",[15,19,20,21,25],{},"Bu yazı, Java 11 ve sonrası yazısının devamı niteliğinde; Java 21'de ",[22,23,24],"strong",{},"kalıcı (final)"," hale gelen özelliklere odaklanıyor.",[27,28,33],"pre",{"className":29,"code":30,"language":31,"meta":32,"style":32},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","java -version          # openjdk version \"21.x\"\n","bash","",[34,35,36],"code",{"__ignoreMap":32},[37,38,41,45,49],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"sBMFI","java",[37,46,48],{"class":47},"sfazB"," -version",[37,50,52],{"class":51},"sHwdD","          # openjdk version \"21.x\"\n",[10,54,56],{"id":55},"_1-virtual-threads-jep-444","1. Virtual threads (JEP 444)",[15,58,59],{},"Klasik platform thread'leri işletim sistemi thread'lerine birebir karşılık gelir; her biri yaklaşık 1 MB stack ayırır ve binlercesini açmak pahalıdır. Virtual thread'ler JVM tarafından yönetilen hafif thread'lerdir: milyonlarcası açılabilir ve bir I\u002FO beklemesinde (veritabanı, HTTP çağrısı) altındaki işletim sistemi thread'ini başka işe bırakırlar.",[27,61,64],{"className":62,"code":63,"language":44,"meta":32,"style":32},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {\n    for (int i = 0; i \u003C 10_000; i++) {\n        int id = i;\n        executor.submit(() -> {\n            Thread.sleep(Duration.ofSeconds(1));   \u002F\u002F bloklayan I\u002FO simülasyonu\n            return id;\n        });\n    }\n}   \u002F\u002F try-with-resources: tüm görevlerin bitmesini bekler\n",[34,65,66,103,144,160,179,212,223,229,235],{"__ignoreMap":32},[37,67,68,72,76,80,84,87,90,93,97,100],{"class":39,"line":40},[37,69,71],{"class":70},"s7zQu","try",[37,73,75],{"class":74},"sMK4o"," (",[37,77,79],{"class":78},"spNyl","var",[37,81,83],{"class":82},"sTEyZ"," executor ",[37,85,86],{"class":74},"=",[37,88,89],{"class":82}," Executors",[37,91,92],{"class":74},".",[37,94,96],{"class":95},"s2Zo4","newVirtualThreadPerTaskExecutor",[37,98,99],{"class":74},"())",[37,101,102],{"class":74}," {\n",[37,104,106,109,111,114,117,119,123,126,128,131,134,136,139,142],{"class":39,"line":105},2,[37,107,108],{"class":70},"    for",[37,110,75],{"class":74},[37,112,113],{"class":78},"int",[37,115,116],{"class":82}," i ",[37,118,86],{"class":74},[37,120,122],{"class":121},"sbssI"," 0",[37,124,125],{"class":74},";",[37,127,116],{"class":82},[37,129,130],{"class":74},"\u003C",[37,132,133],{"class":121}," 10_000",[37,135,125],{"class":74},[37,137,138],{"class":82}," i",[37,140,141],{"class":74},"++)",[37,143,102],{"class":74},[37,145,147,150,153,155,157],{"class":39,"line":146},3,[37,148,149],{"class":78},"        int",[37,151,152],{"class":82}," id ",[37,154,86],{"class":74},[37,156,138],{"class":82},[37,158,159],{"class":74},";\n",[37,161,163,166,168,171,174,177],{"class":39,"line":162},4,[37,164,165],{"class":82},"        executor",[37,167,92],{"class":74},[37,169,170],{"class":95},"submit",[37,172,173],{"class":74},"(()",[37,175,176],{"class":78}," ->",[37,178,102],{"class":74},[37,180,182,185,187,190,193,196,198,201,203,206,209],{"class":39,"line":181},5,[37,183,184],{"class":82},"            Thread",[37,186,92],{"class":74},[37,188,189],{"class":95},"sleep",[37,191,192],{"class":74},"(",[37,194,195],{"class":82},"Duration",[37,197,92],{"class":74},[37,199,200],{"class":95},"ofSeconds",[37,202,192],{"class":74},[37,204,205],{"class":121},"1",[37,207,208],{"class":74},"));",[37,210,211],{"class":51},"   \u002F\u002F bloklayan I\u002FO simülasyonu\n",[37,213,215,218,221],{"class":39,"line":214},6,[37,216,217],{"class":70},"            return",[37,219,220],{"class":82}," id",[37,222,159],{"class":74},[37,224,226],{"class":39,"line":225},7,[37,227,228],{"class":74},"        });\n",[37,230,232],{"class":39,"line":231},8,[37,233,234],{"class":74},"    }\n",[37,236,238,241],{"class":39,"line":237},9,[37,239,240],{"class":74},"}",[37,242,243],{"class":51},"   \u002F\u002F try-with-resources: tüm görevlerin bitmesini bekler\n",[15,245,246],{},"10.000 görev yaklaşık 1 saniyede biter; aynı kod sabit boyutlu bir platform thread havuzuyla dakikalar sürerdi.",[15,248,249],{},"Tek bir virtual thread başlatmak için:",[27,251,253],{"className":62,"code":252,"language":44,"meta":32,"style":32},"Thread.startVirtualThread(() -> System.out.println(\"merhaba\"));\nThread.ofVirtual().name(\"worker-\", 0).start(task);\n",[34,254,255,295],{"__ignoreMap":32},[37,256,257,260,262,265,267,269,272,274,277,279,282,284,287,290,292],{"class":39,"line":40},[37,258,259],{"class":82},"Thread",[37,261,92],{"class":74},[37,263,264],{"class":95},"startVirtualThread",[37,266,173],{"class":74},[37,268,176],{"class":78},[37,270,271],{"class":82}," System",[37,273,92],{"class":74},[37,275,276],{"class":82},"out",[37,278,92],{"class":74},[37,280,281],{"class":95},"println",[37,283,192],{"class":74},[37,285,286],{"class":74},"\"",[37,288,289],{"class":47},"merhaba",[37,291,286],{"class":74},[37,293,294],{"class":74},"));\n",[37,296,297,299,301,304,307,310,312,314,317,319,322,324,327,330,332,335],{"class":39,"line":105},[37,298,259],{"class":82},[37,300,92],{"class":74},[37,302,303],{"class":95},"ofVirtual",[37,305,306],{"class":74},"().",[37,308,309],{"class":95},"name",[37,311,192],{"class":74},[37,313,286],{"class":74},[37,315,316],{"class":47},"worker-",[37,318,286],{"class":74},[37,320,321],{"class":74},",",[37,323,122],{"class":121},[37,325,326],{"class":74},").",[37,328,329],{"class":95},"start",[37,331,192],{"class":74},[37,333,334],{"class":82},"task",[37,336,337],{"class":74},");\n",[15,339,340],{},"Spring Boot 3.2+ uygulamalarında tek satırla açılır:",[27,342,346],{"className":343,"code":344,"language":345,"meta":32,"style":32},"language-properties shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","spring.threads.virtual.enabled=true\n","properties",[34,347,348],{"__ignoreMap":32},[37,349,350,354,356],{"class":39,"line":40},[37,351,353],{"class":352},"swJcz","spring.threads.virtual.enabled",[37,355,86],{"class":74},[37,357,358],{"class":82},"true\n",[15,360,361],{},"Dikkat edilmesi gerekenler:",[363,364,365,373,376,391],"ul",{},[366,367,368,369,372],"li",{},"Virtual thread'ler ",[22,370,371],{},"I\u002FO ağırlıklı"," işlerde fayda sağlar; CPU ağırlıklı hesaplamayı hızlandırmaz.",[366,374,375],{},"Virtual thread'leri havuzlamayın; her görev için yenisini açmak doğru kullanımdır.",[366,377,378,379,382,383,386,387,390],{},"Java 21'de ",[34,380,381],{},"synchronized"," blok içinde bloklayan bir çağrı, virtual thread'i taşıyıcı thread'e ",[22,384,385],{},"sabitler (pinning)",". Sık çalışan kritik bölgelerde ",[34,388,389],{},"ReentrantLock"," tercih edin. (Bu kısıt Java 24 ile kaldırıldı.)",[366,392,393,396],{},[34,394,395],{},"ThreadLocal"," ile büyük nesneler tutmak milyonlarca thread'de bellek sorununa dönüşebilir.",[10,398,400],{"id":399},"_2-records","2. Records",[15,402,403,404,407,408,411,412,415],{},"Java 16'da kalıcı hale gelen record'lar, sadece veri taşıyan sınıflar için constructor, getter, ",[34,405,406],{},"equals",", ",[34,409,410],{},"hashCode"," ve ",[34,413,414],{},"toString"," yazma ihtiyacını ortadan kaldırır:",[27,417,419],{"className":62,"code":418,"language":44,"meta":32,"style":32},"public record User(Long id, String name, String email) { }\n\nvar user = new User(1L, \"Şükrü\", \"sukru@example.com\");\nuser.name();            \u002F\u002F getter: getName() değil name()\nSystem.out.println(user);   \u002F\u002F User[id=1, name=Şükrü, email=sukru@example.com]\n",[34,420,421,463,469,509,524],{"__ignoreMap":32},[37,422,423,426,429,432,434,437,439,441,444,447,449,451,454,457,460],{"class":39,"line":40},[37,424,425],{"class":78},"public",[37,427,428],{"class":78}," record",[37,430,431],{"class":43}," User",[37,433,192],{"class":74},[37,435,436],{"class":78},"Long",[37,438,220],{"class":82},[37,440,321],{"class":74},[37,442,443],{"class":78}," String",[37,445,446],{"class":82}," name",[37,448,321],{"class":74},[37,450,443],{"class":78},[37,452,453],{"class":82}," email",[37,455,456],{"class":74},")",[37,458,459],{"class":74}," {",[37,461,462],{"class":74}," }\n",[37,464,465],{"class":39,"line":105},[37,466,468],{"emptyLinePlaceholder":467},true,"\n",[37,470,471,473,476,478,481,483,485,488,490,493,496,498,500,502,505,507],{"class":39,"line":146},[37,472,79],{"class":78},[37,474,475],{"class":82}," user ",[37,477,86],{"class":74},[37,479,480],{"class":70}," new",[37,482,431],{"class":95},[37,484,192],{"class":74},[37,486,487],{"class":121},"1L",[37,489,321],{"class":74},[37,491,492],{"class":74}," \"",[37,494,495],{"class":47},"Şükrü",[37,497,286],{"class":74},[37,499,321],{"class":74},[37,501,492],{"class":74},[37,503,504],{"class":47},"sukru@example.com",[37,506,286],{"class":74},[37,508,337],{"class":74},[37,510,511,514,516,518,521],{"class":39,"line":162},[37,512,513],{"class":82},"user",[37,515,92],{"class":74},[37,517,309],{"class":95},[37,519,520],{"class":74},"();",[37,522,523],{"class":51},"            \u002F\u002F getter: getName() değil name()\n",[37,525,526,529,531,533,535,537,539,541,544],{"class":39,"line":181},[37,527,528],{"class":82},"System",[37,530,92],{"class":74},[37,532,276],{"class":82},[37,534,92],{"class":74},[37,536,281],{"class":95},[37,538,192],{"class":74},[37,540,513],{"class":82},[37,542,543],{"class":74},");",[37,545,546],{"class":51},"   \u002F\u002F User[id=1, name=Şükrü, email=sukru@example.com]\n",[15,548,549],{},"Doğrulama için kompakt constructor:",[27,551,553],{"className":62,"code":552,"language":44,"meta":32,"style":32},"public record Money(BigDecimal amount, String currency) {\n    public Money {\n        if (amount.signum() \u003C 0) throw new IllegalArgumentException(\"negatif tutar\");\n        currency = currency.toUpperCase();\n    }\n}\n",[34,554,555,583,592,636,653,657],{"__ignoreMap":32},[37,556,557,559,561,564,566,569,572,574,576,579,581],{"class":39,"line":40},[37,558,425],{"class":78},[37,560,428],{"class":78},[37,562,563],{"class":43}," Money",[37,565,192],{"class":74},[37,567,568],{"class":78},"BigDecimal",[37,570,571],{"class":82}," amount",[37,573,321],{"class":74},[37,575,443],{"class":78},[37,577,578],{"class":82}," currency",[37,580,456],{"class":74},[37,582,102],{"class":74},[37,584,585,588,590],{"class":39,"line":105},[37,586,587],{"class":78},"    public",[37,589,563],{"class":95},[37,591,102],{"class":74},[37,593,594,597,599,602,604,607,610,613,615,617,620,622,625,627,629,632,634],{"class":39,"line":146},[37,595,596],{"class":70},"        if",[37,598,75],{"class":74},[37,600,601],{"class":82},"amount",[37,603,92],{"class":74},[37,605,606],{"class":95},"signum",[37,608,609],{"class":74},"()",[37,611,612],{"class":74}," \u003C",[37,614,122],{"class":121},[37,616,456],{"class":74},[37,618,619],{"class":70}," throw",[37,621,480],{"class":70},[37,623,624],{"class":95}," IllegalArgumentException",[37,626,192],{"class":74},[37,628,286],{"class":74},[37,630,631],{"class":47},"negatif tutar",[37,633,286],{"class":74},[37,635,337],{"class":74},[37,637,638,641,643,645,647,650],{"class":39,"line":162},[37,639,640],{"class":82},"        currency ",[37,642,86],{"class":74},[37,644,578],{"class":82},[37,646,92],{"class":74},[37,648,649],{"class":95},"toUpperCase",[37,651,652],{"class":74},"();\n",[37,654,655],{"class":39,"line":181},[37,656,234],{"class":74},[37,658,659],{"class":39,"line":214},[37,660,661],{"class":74},"}\n",[15,663,664,665,668],{},"Record'lar değiştirilemez (immutable) ve ",[34,666,667],{},"final","'dır; DTO'lar, API yanıtları ve map anahtarları için idealdir. JPA entity'si olarak ise kullanılamazlar.",[10,670,672],{"id":671},"_3-switch-için-pattern-matching-jep-441","3. Switch için pattern matching (JEP 441)",[15,674,675,678,679,682],{},[34,676,677],{},"switch"," artık tip üzerinde eşleşebilir, değişkeni doğrudan bağlar ve ",[34,680,681],{},"when"," ile koşul ekleyebilir:",[27,684,686],{"className":62,"code":685,"language":44,"meta":32,"style":32},"static String describe(Object obj) {\n    return switch (obj) {\n        case null                      -> \"null\";\n        case Integer i when i > 100    -> \"büyük sayı: \" + i;\n        case Integer i                 -> \"sayı: \" + i;\n        case String s when s.isBlank() -> \"boş metin\";\n        case String s                  -> \"metin: \" + s;\n        case List\u003C?> list              -> \"liste, boyut \" + list.size();\n        default                        -> \"bilinmeyen: \" + obj.getClass().getSimpleName();\n    };\n}\n",[34,687,688,710,727,747,780,805,832,857,895,926,932],{"__ignoreMap":32},[37,689,690,693,695,698,700,703,706,708],{"class":39,"line":40},[37,691,692],{"class":78},"static",[37,694,443],{"class":78},[37,696,697],{"class":95}," describe",[37,699,192],{"class":74},[37,701,702],{"class":78},"Object",[37,704,705],{"class":82}," obj",[37,707,456],{"class":74},[37,709,102],{"class":74},[37,711,712,715,718,720,723,725],{"class":39,"line":105},[37,713,714],{"class":70},"    return",[37,716,717],{"class":70}," switch",[37,719,75],{"class":74},[37,721,722],{"class":82},"obj",[37,724,456],{"class":74},[37,726,102],{"class":74},[37,728,729,732,735,738,740,743,745],{"class":39,"line":146},[37,730,731],{"class":70},"        case",[37,733,734],{"class":74}," null",[37,736,737],{"class":78},"                      ->",[37,739,492],{"class":74},[37,741,742],{"class":47},"null",[37,744,286],{"class":74},[37,746,159],{"class":74},[37,748,749,751,754,757,760,763,766,768,771,773,776,778],{"class":39,"line":162},[37,750,731],{"class":70},[37,752,753],{"class":78}," Integer",[37,755,756],{"class":82}," i when i ",[37,758,759],{"class":74},">",[37,761,762],{"class":121}," 100",[37,764,765],{"class":78},"    ->",[37,767,492],{"class":74},[37,769,770],{"class":47},"büyük sayı: ",[37,772,286],{"class":74},[37,774,775],{"class":74}," +",[37,777,138],{"class":82},[37,779,159],{"class":74},[37,781,782,784,786,789,792,794,797,799,801,803],{"class":39,"line":181},[37,783,731],{"class":70},[37,785,753],{"class":78},[37,787,788],{"class":82}," i                 ",[37,790,791],{"class":78},"->",[37,793,492],{"class":74},[37,795,796],{"class":47},"sayı: ",[37,798,286],{"class":74},[37,800,775],{"class":74},[37,802,138],{"class":82},[37,804,159],{"class":74},[37,806,807,809,811,814,816,819,821,823,825,828,830],{"class":39,"line":214},[37,808,731],{"class":70},[37,810,443],{"class":78},[37,812,813],{"class":82}," s when s",[37,815,92],{"class":74},[37,817,818],{"class":95},"isBlank",[37,820,609],{"class":74},[37,822,176],{"class":78},[37,824,492],{"class":74},[37,826,827],{"class":47},"boş metin",[37,829,286],{"class":74},[37,831,159],{"class":74},[37,833,834,836,838,841,843,845,848,850,852,855],{"class":39,"line":225},[37,835,731],{"class":70},[37,837,443],{"class":78},[37,839,840],{"class":82}," s                  ",[37,842,791],{"class":78},[37,844,492],{"class":74},[37,846,847],{"class":47},"metin: ",[37,849,286],{"class":74},[37,851,775],{"class":74},[37,853,854],{"class":82}," s",[37,856,159],{"class":74},[37,858,859,861,864,866,869,871,874,876,878,881,883,885,888,890,893],{"class":39,"line":231},[37,860,731],{"class":70},[37,862,863],{"class":78}," List",[37,865,130],{"class":74},[37,867,868],{"class":70},"?",[37,870,759],{"class":74},[37,872,873],{"class":82}," list              ",[37,875,791],{"class":78},[37,877,492],{"class":74},[37,879,880],{"class":47},"liste, boyut ",[37,882,286],{"class":74},[37,884,775],{"class":74},[37,886,887],{"class":82}," list",[37,889,92],{"class":74},[37,891,892],{"class":95},"size",[37,894,652],{"class":74},[37,896,897,900,903,905,908,910,912,914,916,919,921,924],{"class":39,"line":237},[37,898,899],{"class":70},"        default",[37,901,902],{"class":78},"                        ->",[37,904,492],{"class":74},[37,906,907],{"class":47},"bilinmeyen: ",[37,909,286],{"class":74},[37,911,775],{"class":74},[37,913,705],{"class":82},[37,915,92],{"class":74},[37,917,918],{"class":95},"getClass",[37,920,306],{"class":74},[37,922,923],{"class":95},"getSimpleName",[37,925,652],{"class":74},[37,927,929],{"class":39,"line":928},10,[37,930,931],{"class":74},"    };\n",[37,933,935],{"class":39,"line":934},11,[37,936,661],{"class":74},[15,938,939],{},"Eski yöntemle karşılaştırın:",[27,941,943],{"className":62,"code":942,"language":44,"meta":32,"style":32},"if (obj instanceof Integer) {\n    Integer i = (Integer) obj;\n    ...\n} else if (obj instanceof String) {\n    ...\n}\n",[34,944,945,964,984,989,1011,1015],{"__ignoreMap":32},[37,946,947,950,952,955,958,960,962],{"class":39,"line":40},[37,948,949],{"class":70},"if",[37,951,75],{"class":74},[37,953,954],{"class":82},"obj ",[37,956,957],{"class":74},"instanceof",[37,959,753],{"class":82},[37,961,456],{"class":74},[37,963,102],{"class":74},[37,965,966,969,971,973,975,978,980,982],{"class":39,"line":105},[37,967,968],{"class":78},"    Integer",[37,970,116],{"class":82},[37,972,86],{"class":74},[37,974,75],{"class":74},[37,976,977],{"class":82},"Integer",[37,979,456],{"class":74},[37,981,705],{"class":82},[37,983,159],{"class":74},[37,985,986],{"class":39,"line":146},[37,987,988],{"class":74},"    ...\n",[37,990,991,993,996,999,1001,1003,1005,1007,1009],{"class":39,"line":162},[37,992,240],{"class":74},[37,994,995],{"class":70}," else",[37,997,998],{"class":70}," if",[37,1000,75],{"class":74},[37,1002,954],{"class":82},[37,1004,957],{"class":74},[37,1006,443],{"class":82},[37,1008,456],{"class":74},[37,1010,102],{"class":74},[37,1012,1013],{"class":39,"line":181},[37,1014,988],{"class":74},[37,1016,1017],{"class":39,"line":214},[37,1018,661],{"class":74},[15,1020,1021,1024],{},[34,1022,1023],{},"case null"," desteği sayesinde switch öncesi ayrı bir null kontrolüne de gerek kalmaz.",[10,1026,1028],{"id":1027},"_4-record-patternleri-jep-440","4. Record pattern'leri (JEP 440)",[15,1030,1031],{},"Record'ları eşleşme sırasında doğrudan bileşenlerine ayırabilirsiniz; iç içe yapılar da desteklenir:",[27,1033,1035],{"className":62,"code":1034,"language":44,"meta":32,"style":32},"record Point(int x, int y) { }\nrecord Line(Point start, Point end) { }\n\nstatic String where(Object obj) {\n    return switch (obj) {\n        case Point(int x, int y) when x == 0 && y == 0 -> \"orijin\";\n        case Point(var x, var y)                        -> \"nokta (\" + x + \", \" + y + \")\";\n        case Line(Point(var x1, var y1), Point(var x2, var y2))\n            -> \"çizgi uzunluğu \" + Math.hypot(x2 - x1, y2 - y1);\n        default -> \"bilinmiyor\";\n    };\n}\n",[34,1036,1037,1066,1094,1098,1117,1131,1180,1235,1273,1318,1333,1337],{"__ignoreMap":32},[37,1038,1039,1042,1045,1047,1049,1052,1054,1057,1060,1062,1064],{"class":39,"line":40},[37,1040,1041],{"class":78},"record",[37,1043,1044],{"class":43}," Point",[37,1046,192],{"class":74},[37,1048,113],{"class":78},[37,1050,1051],{"class":82}," x",[37,1053,321],{"class":74},[37,1055,1056],{"class":78}," int",[37,1058,1059],{"class":82}," y",[37,1061,456],{"class":74},[37,1063,459],{"class":74},[37,1065,462],{"class":74},[37,1067,1068,1070,1073,1075,1078,1081,1083,1085,1088,1090,1092],{"class":39,"line":105},[37,1069,1041],{"class":78},[37,1071,1072],{"class":43}," Line",[37,1074,192],{"class":74},[37,1076,1077],{"class":78},"Point",[37,1079,1080],{"class":82}," start",[37,1082,321],{"class":74},[37,1084,1044],{"class":78},[37,1086,1087],{"class":82}," end",[37,1089,456],{"class":74},[37,1091,459],{"class":74},[37,1093,462],{"class":74},[37,1095,1096],{"class":39,"line":146},[37,1097,468],{"emptyLinePlaceholder":467},[37,1099,1100,1102,1104,1107,1109,1111,1113,1115],{"class":39,"line":162},[37,1101,692],{"class":78},[37,1103,443],{"class":78},[37,1105,1106],{"class":95}," where",[37,1108,192],{"class":74},[37,1110,702],{"class":78},[37,1112,705],{"class":82},[37,1114,456],{"class":74},[37,1116,102],{"class":74},[37,1118,1119,1121,1123,1125,1127,1129],{"class":39,"line":181},[37,1120,714],{"class":70},[37,1122,717],{"class":70},[37,1124,75],{"class":74},[37,1126,722],{"class":82},[37,1128,456],{"class":74},[37,1130,102],{"class":74},[37,1132,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1154,1157,1159,1162,1165,1167,1169,1171,1173,1176,1178],{"class":39,"line":214},[37,1134,731],{"class":70},[37,1136,1044],{"class":95},[37,1138,192],{"class":74},[37,1140,113],{"class":78},[37,1142,1051],{"class":82},[37,1144,321],{"class":74},[37,1146,1056],{"class":78},[37,1148,1059],{"class":82},[37,1150,456],{"class":74},[37,1152,1153],{"class":82}," when x ",[37,1155,1156],{"class":74},"==",[37,1158,122],{"class":121},[37,1160,1161],{"class":74}," &&",[37,1163,1164],{"class":82}," y ",[37,1166,1156],{"class":74},[37,1168,122],{"class":121},[37,1170,176],{"class":78},[37,1172,492],{"class":74},[37,1174,1175],{"class":47},"orijin",[37,1177,286],{"class":74},[37,1179,159],{"class":74},[37,1181,1182,1184,1186,1188,1191,1193,1196,1198,1200,1202,1205,1207,1209,1212,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233],{"class":39,"line":225},[37,1183,731],{"class":70},[37,1185,1044],{"class":95},[37,1187,192],{"class":74},[37,1189,1190],{"class":82},"var x",[37,1192,321],{"class":74},[37,1194,1195],{"class":82}," var y",[37,1197,456],{"class":74},[37,1199,902],{"class":78},[37,1201,492],{"class":74},[37,1203,1204],{"class":47},"nokta (",[37,1206,286],{"class":74},[37,1208,775],{"class":74},[37,1210,1211],{"class":82}," x ",[37,1213,1214],{"class":74},"+",[37,1216,492],{"class":74},[37,1218,407],{"class":47},[37,1220,286],{"class":74},[37,1222,775],{"class":74},[37,1224,1164],{"class":82},[37,1226,1214],{"class":74},[37,1228,492],{"class":74},[37,1230,456],{"class":47},[37,1232,286],{"class":74},[37,1234,159],{"class":74},[37,1236,1237,1239,1241,1243,1245,1247,1250,1252,1255,1258,1260,1262,1265,1267,1270],{"class":39,"line":231},[37,1238,731],{"class":70},[37,1240,1072],{"class":95},[37,1242,192],{"class":74},[37,1244,1077],{"class":95},[37,1246,192],{"class":74},[37,1248,1249],{"class":82},"var x1",[37,1251,321],{"class":74},[37,1253,1254],{"class":82}," var y1",[37,1256,1257],{"class":74},"),",[37,1259,1044],{"class":95},[37,1261,192],{"class":74},[37,1263,1264],{"class":82},"var x2",[37,1266,321],{"class":74},[37,1268,1269],{"class":82}," var y2",[37,1271,1272],{"class":74},"))\n",[37,1274,1275,1278,1280,1283,1285,1287,1290,1292,1295,1297,1300,1303,1306,1308,1311,1313,1316],{"class":39,"line":237},[37,1276,1277],{"class":78},"            ->",[37,1279,492],{"class":74},[37,1281,1282],{"class":47},"çizgi uzunluğu ",[37,1284,286],{"class":74},[37,1286,775],{"class":74},[37,1288,1289],{"class":82}," Math",[37,1291,92],{"class":74},[37,1293,1294],{"class":95},"hypot",[37,1296,192],{"class":74},[37,1298,1299],{"class":82},"x2 ",[37,1301,1302],{"class":74},"-",[37,1304,1305],{"class":82}," x1",[37,1307,321],{"class":74},[37,1309,1310],{"class":82}," y2 ",[37,1312,1302],{"class":74},[37,1314,1315],{"class":82}," y1",[37,1317,337],{"class":74},[37,1319,1320,1322,1324,1326,1329,1331],{"class":39,"line":928},[37,1321,899],{"class":70},[37,1323,176],{"class":78},[37,1325,492],{"class":74},[37,1327,1328],{"class":47},"bilinmiyor",[37,1330,286],{"class":74},[37,1332,159],{"class":74},[37,1334,1335],{"class":39,"line":934},[37,1336,931],{"class":74},[37,1338,1340],{"class":39,"line":1339},12,[37,1341,661],{"class":74},[15,1343,1344,1346],{},[34,1345,957],{}," ile de çalışır:",[27,1348,1350],{"className":62,"code":1349,"language":44,"meta":32,"style":32},"if (obj instanceof Point(int x, int y)) {\n    System.out.println(x + y);\n}\n",[34,1351,1352,1381,1405],{"__ignoreMap":32},[37,1353,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1379],{"class":39,"line":40},[37,1355,949],{"class":70},[37,1357,75],{"class":74},[37,1359,954],{"class":82},[37,1361,957],{"class":74},[37,1363,1044],{"class":95},[37,1365,192],{"class":74},[37,1367,113],{"class":78},[37,1369,1051],{"class":82},[37,1371,321],{"class":74},[37,1373,1056],{"class":78},[37,1375,1059],{"class":82},[37,1377,1378],{"class":74},"))",[37,1380,102],{"class":74},[37,1382,1383,1386,1388,1390,1392,1394,1396,1399,1401,1403],{"class":39,"line":105},[37,1384,1385],{"class":82},"    System",[37,1387,92],{"class":74},[37,1389,276],{"class":82},[37,1391,92],{"class":74},[37,1393,281],{"class":95},[37,1395,192],{"class":74},[37,1397,1398],{"class":82},"x ",[37,1400,1214],{"class":74},[37,1402,1059],{"class":82},[37,1404,337],{"class":74},[37,1406,1407],{"class":39,"line":146},[37,1408,661],{"class":74},[10,1410,1412],{"id":1411},"_5-sealed-sınıflar-ve-exhaustive-switch","5. Sealed sınıflar ve exhaustive switch",[15,1414,1415,1416,1419],{},"Java 17'de kalıcı hale gelen sealed sınıflar, bir tipin hangi alt tiplere sahip olabileceğini sınırlar. Pattern matching ile birleşince derleyici tüm durumların ele alındığını kontrol eder ve ",[34,1417,1418],{},"default"," gerekmez:",[27,1421,1423],{"className":62,"code":1422,"language":44,"meta":32,"style":32},"public sealed interface PaymentResult\n        permits Success, Declined, Failed { }\n\npublic record Success(String transactionId) implements PaymentResult { }\npublic record Declined(String reason) implements PaymentResult { }\npublic record Failed(Exception error) implements PaymentResult { }\n\nString message = switch (result) {\n    case Success s  -> \"Ödeme alındı: \" + s.transactionId();\n    case Declined d -> \"Reddedildi: \" + d.reason();\n    case Failed f   -> \"Hata: \" + f.error().getMessage();\n};\n",[34,1424,1425,1438,1460,1464,1492,1517,1543,1547,1567,1597,1627,1662],{"__ignoreMap":32},[37,1426,1427,1429,1432,1435],{"class":39,"line":40},[37,1428,425],{"class":78},[37,1430,1431],{"class":78}," sealed",[37,1433,1434],{"class":78}," interface",[37,1436,1437],{"class":43}," PaymentResult\n",[37,1439,1440,1443,1446,1448,1451,1453,1456,1458],{"class":39,"line":105},[37,1441,1442],{"class":78},"        permits",[37,1444,1445],{"class":43}," Success",[37,1447,321],{"class":74},[37,1449,1450],{"class":43}," Declined",[37,1452,321],{"class":74},[37,1454,1455],{"class":43}," Failed",[37,1457,459],{"class":74},[37,1459,462],{"class":74},[37,1461,1462],{"class":39,"line":146},[37,1463,468],{"emptyLinePlaceholder":467},[37,1465,1466,1468,1470,1472,1474,1477,1480,1482,1485,1488,1490],{"class":39,"line":162},[37,1467,425],{"class":78},[37,1469,428],{"class":78},[37,1471,1445],{"class":43},[37,1473,192],{"class":74},[37,1475,1476],{"class":78},"String",[37,1478,1479],{"class":82}," transactionId",[37,1481,456],{"class":74},[37,1483,1484],{"class":78}," implements",[37,1486,1487],{"class":43}," PaymentResult",[37,1489,459],{"class":74},[37,1491,462],{"class":74},[37,1493,1494,1496,1498,1500,1502,1504,1507,1509,1511,1513,1515],{"class":39,"line":181},[37,1495,425],{"class":78},[37,1497,428],{"class":78},[37,1499,1450],{"class":43},[37,1501,192],{"class":74},[37,1503,1476],{"class":78},[37,1505,1506],{"class":82}," reason",[37,1508,456],{"class":74},[37,1510,1484],{"class":78},[37,1512,1487],{"class":43},[37,1514,459],{"class":74},[37,1516,462],{"class":74},[37,1518,1519,1521,1523,1525,1527,1530,1533,1535,1537,1539,1541],{"class":39,"line":214},[37,1520,425],{"class":78},[37,1522,428],{"class":78},[37,1524,1455],{"class":43},[37,1526,192],{"class":74},[37,1528,1529],{"class":78},"Exception",[37,1531,1532],{"class":82}," error",[37,1534,456],{"class":74},[37,1536,1484],{"class":78},[37,1538,1487],{"class":43},[37,1540,459],{"class":74},[37,1542,462],{"class":74},[37,1544,1545],{"class":39,"line":225},[37,1546,468],{"emptyLinePlaceholder":467},[37,1548,1549,1551,1554,1556,1558,1560,1563,1565],{"class":39,"line":231},[37,1550,1476],{"class":78},[37,1552,1553],{"class":82}," message ",[37,1555,86],{"class":74},[37,1557,717],{"class":70},[37,1559,75],{"class":74},[37,1561,1562],{"class":82},"result",[37,1564,456],{"class":74},[37,1566,102],{"class":74},[37,1568,1569,1572,1574,1577,1579,1581,1584,1586,1588,1590,1592,1595],{"class":39,"line":237},[37,1570,1571],{"class":70},"    case",[37,1573,1445],{"class":78},[37,1575,1576],{"class":82}," s  ",[37,1578,791],{"class":78},[37,1580,492],{"class":74},[37,1582,1583],{"class":47},"Ödeme alındı: ",[37,1585,286],{"class":74},[37,1587,775],{"class":74},[37,1589,854],{"class":82},[37,1591,92],{"class":74},[37,1593,1594],{"class":95},"transactionId",[37,1596,652],{"class":74},[37,1598,1599,1601,1603,1606,1608,1610,1613,1615,1617,1620,1622,1625],{"class":39,"line":928},[37,1600,1571],{"class":70},[37,1602,1450],{"class":78},[37,1604,1605],{"class":82}," d ",[37,1607,791],{"class":78},[37,1609,492],{"class":74},[37,1611,1612],{"class":47},"Reddedildi: ",[37,1614,286],{"class":74},[37,1616,775],{"class":74},[37,1618,1619],{"class":82}," d",[37,1621,92],{"class":74},[37,1623,1624],{"class":95},"reason",[37,1626,652],{"class":74},[37,1628,1629,1631,1633,1636,1638,1640,1643,1645,1647,1650,1652,1655,1657,1660],{"class":39,"line":934},[37,1630,1571],{"class":70},[37,1632,1455],{"class":78},[37,1634,1635],{"class":82}," f   ",[37,1637,791],{"class":78},[37,1639,492],{"class":74},[37,1641,1642],{"class":47},"Hata: ",[37,1644,286],{"class":74},[37,1646,775],{"class":74},[37,1648,1649],{"class":82}," f",[37,1651,92],{"class":74},[37,1653,1654],{"class":95},"error",[37,1656,306],{"class":74},[37,1658,1659],{"class":95},"getMessage",[37,1661,652],{"class":74},[37,1663,1664],{"class":39,"line":1339},[37,1665,1666],{"class":74},"};\n",[15,1668,1669,1670,1673,1674,1677],{},"Yarın ",[34,1671,1672],{},"PaymentResult","'a yeni bir tip eklenirse, bu switch'i güncellemediğiniz her yer ",[22,1675,1676],{},"derleme hatası"," verir. Hata türlerini ve durum makinelerini modellemek için çok güçlü bir araçtır.",[10,1679,1681],{"id":1680},"_6-sequenced-collections-jep-431","6. Sequenced collections (JEP 431)",[15,1683,1684],{},"Sırası olan koleksiyonlarda ilk\u002Fson elemana erişim için ortak bir API geldi:",[27,1686,1688],{"className":62,"code":1687,"language":44,"meta":32,"style":32},"List\u003CString> list = new ArrayList\u003C>(List.of(\"a\", \"b\", \"c\"));\nlist.getFirst();       \u002F\u002F \"a\"   (eskiden list.get(0))\nlist.getLast();        \u002F\u002F \"c\"   (eskiden list.get(list.size() - 1))\nlist.addFirst(\"z\");\nlist.removeLast();\nlist.reversed();       \u002F\u002F ters sıralı görünüm\n\nLinkedHashMap\u003CString, Integer> map = new LinkedHashMap\u003C>();\nmap.put(\"bir\", 1);\nmap.put(\"iki\", 2);\nmap.firstEntry();      \u002F\u002F bir=1\nmap.lastEntry();       \u002F\u002F iki=2\n",[34,1689,1690,1750,1765,1779,1799,1810,1824,1828,1856,1882,1906,1920],{"__ignoreMap":32},[37,1691,1692,1695,1697,1699,1701,1704,1706,1708,1711,1714,1716,1718,1721,1723,1725,1728,1730,1732,1734,1737,1739,1741,1743,1746,1748],{"class":39,"line":40},[37,1693,1694],{"class":78},"List",[37,1696,130],{"class":74},[37,1698,1476],{"class":78},[37,1700,759],{"class":74},[37,1702,1703],{"class":82}," list ",[37,1705,86],{"class":74},[37,1707,480],{"class":70},[37,1709,1710],{"class":78}," ArrayList",[37,1712,1713],{"class":74},"\u003C>(",[37,1715,1694],{"class":82},[37,1717,92],{"class":74},[37,1719,1720],{"class":95},"of",[37,1722,192],{"class":74},[37,1724,286],{"class":74},[37,1726,1727],{"class":47},"a",[37,1729,286],{"class":74},[37,1731,321],{"class":74},[37,1733,492],{"class":74},[37,1735,1736],{"class":47},"b",[37,1738,286],{"class":74},[37,1740,321],{"class":74},[37,1742,492],{"class":74},[37,1744,1745],{"class":47},"c",[37,1747,286],{"class":74},[37,1749,294],{"class":74},[37,1751,1752,1755,1757,1760,1762],{"class":39,"line":105},[37,1753,1754],{"class":82},"list",[37,1756,92],{"class":74},[37,1758,1759],{"class":95},"getFirst",[37,1761,520],{"class":74},[37,1763,1764],{"class":51},"       \u002F\u002F \"a\"   (eskiden list.get(0))\n",[37,1766,1767,1769,1771,1774,1776],{"class":39,"line":146},[37,1768,1754],{"class":82},[37,1770,92],{"class":74},[37,1772,1773],{"class":95},"getLast",[37,1775,520],{"class":74},[37,1777,1778],{"class":51},"        \u002F\u002F \"c\"   (eskiden list.get(list.size() - 1))\n",[37,1780,1781,1783,1785,1788,1790,1792,1795,1797],{"class":39,"line":162},[37,1782,1754],{"class":82},[37,1784,92],{"class":74},[37,1786,1787],{"class":95},"addFirst",[37,1789,192],{"class":74},[37,1791,286],{"class":74},[37,1793,1794],{"class":47},"z",[37,1796,286],{"class":74},[37,1798,337],{"class":74},[37,1800,1801,1803,1805,1808],{"class":39,"line":181},[37,1802,1754],{"class":82},[37,1804,92],{"class":74},[37,1806,1807],{"class":95},"removeLast",[37,1809,652],{"class":74},[37,1811,1812,1814,1816,1819,1821],{"class":39,"line":214},[37,1813,1754],{"class":82},[37,1815,92],{"class":74},[37,1817,1818],{"class":95},"reversed",[37,1820,520],{"class":74},[37,1822,1823],{"class":51},"       \u002F\u002F ters sıralı görünüm\n",[37,1825,1826],{"class":39,"line":225},[37,1827,468],{"emptyLinePlaceholder":467},[37,1829,1830,1833,1835,1837,1839,1841,1843,1846,1848,1850,1853],{"class":39,"line":231},[37,1831,1832],{"class":78},"LinkedHashMap",[37,1834,130],{"class":74},[37,1836,1476],{"class":78},[37,1838,321],{"class":74},[37,1840,753],{"class":78},[37,1842,759],{"class":74},[37,1844,1845],{"class":82}," map ",[37,1847,86],{"class":74},[37,1849,480],{"class":70},[37,1851,1852],{"class":78}," LinkedHashMap",[37,1854,1855],{"class":74},"\u003C>();\n",[37,1857,1858,1861,1863,1866,1868,1870,1873,1875,1877,1880],{"class":39,"line":237},[37,1859,1860],{"class":82},"map",[37,1862,92],{"class":74},[37,1864,1865],{"class":95},"put",[37,1867,192],{"class":74},[37,1869,286],{"class":74},[37,1871,1872],{"class":47},"bir",[37,1874,286],{"class":74},[37,1876,321],{"class":74},[37,1878,1879],{"class":121}," 1",[37,1881,337],{"class":74},[37,1883,1884,1886,1888,1890,1892,1894,1897,1899,1901,1904],{"class":39,"line":928},[37,1885,1860],{"class":82},[37,1887,92],{"class":74},[37,1889,1865],{"class":95},[37,1891,192],{"class":74},[37,1893,286],{"class":74},[37,1895,1896],{"class":47},"iki",[37,1898,286],{"class":74},[37,1900,321],{"class":74},[37,1902,1903],{"class":121}," 2",[37,1905,337],{"class":74},[37,1907,1908,1910,1912,1915,1917],{"class":39,"line":934},[37,1909,1860],{"class":82},[37,1911,92],{"class":74},[37,1913,1914],{"class":95},"firstEntry",[37,1916,520],{"class":74},[37,1918,1919],{"class":51},"      \u002F\u002F bir=1\n",[37,1921,1922,1924,1926,1929,1931],{"class":39,"line":1339},[37,1923,1860],{"class":82},[37,1925,92],{"class":74},[37,1927,1928],{"class":95},"lastEntry",[37,1930,520],{"class":74},[37,1932,1933],{"class":51},"       \u002F\u002F iki=2\n",[15,1935,1936,407,1938,407,1941,407,1944,407,1946,407,1949,1952,1953,407,1956,1959],{},[34,1937,1694],{},[34,1939,1940],{},"Deque",[34,1942,1943],{},"LinkedHashSet",[34,1945,1832],{},[34,1947,1948],{},"TreeSet",[34,1950,1951],{},"TreeMap"," bu arayüzleri (",[34,1954,1955],{},"SequencedCollection",[34,1957,1958],{},"SequencedMap",") uygular.",[10,1961,1963],{"id":1962},"_7-diğer-küçük-ama-faydalı-eklemeler","7. Diğer küçük ama faydalı eklemeler",[27,1965,1967],{"className":62,"code":1966,"language":44,"meta":32,"style":32},"\u002F\u002F String\n\"merhaba dünya\".indexOf('a', 2, 8);      \u002F\u002F aralık içinde arama\nnew StringBuilder().repeat(\"-\", 20);     \u002F\u002F \"--------------------\"\n\n\u002F\u002F Math\nMath.clamp(150, 0, 100);                 \u002F\u002F 100\n\n\u002F\u002F Character\nCharacter.isEmoji(0x1F600);              \u002F\u002F true\n",[34,1968,1969,1974,2011,2042,2046,2051,2079,2083,2088],{"__ignoreMap":32},[37,1970,1971],{"class":39,"line":40},[37,1972,1973],{"class":51},"\u002F\u002F String\n",[37,1975,1976,1978,1981,1983,1985,1988,1990,1993,1995,1997,1999,2001,2003,2006,2008],{"class":39,"line":105},[37,1977,286],{"class":74},[37,1979,1980],{"class":47},"merhaba dünya",[37,1982,286],{"class":74},[37,1984,92],{"class":74},[37,1986,1987],{"class":95},"indexOf",[37,1989,192],{"class":74},[37,1991,1992],{"class":74},"'",[37,1994,1727],{"class":47},[37,1996,1992],{"class":74},[37,1998,321],{"class":74},[37,2000,1903],{"class":121},[37,2002,321],{"class":74},[37,2004,2005],{"class":121}," 8",[37,2007,543],{"class":74},[37,2009,2010],{"class":51},"      \u002F\u002F aralık içinde arama\n",[37,2012,2013,2016,2019,2021,2024,2026,2028,2030,2032,2034,2037,2039],{"class":39,"line":146},[37,2014,2015],{"class":70},"new",[37,2017,2018],{"class":95}," StringBuilder",[37,2020,306],{"class":74},[37,2022,2023],{"class":95},"repeat",[37,2025,192],{"class":74},[37,2027,286],{"class":74},[37,2029,1302],{"class":47},[37,2031,286],{"class":74},[37,2033,321],{"class":74},[37,2035,2036],{"class":121}," 20",[37,2038,543],{"class":74},[37,2040,2041],{"class":51},"     \u002F\u002F \"--------------------\"\n",[37,2043,2044],{"class":39,"line":162},[37,2045,468],{"emptyLinePlaceholder":467},[37,2047,2048],{"class":39,"line":181},[37,2049,2050],{"class":51},"\u002F\u002F Math\n",[37,2052,2053,2056,2058,2061,2063,2066,2068,2070,2072,2074,2076],{"class":39,"line":214},[37,2054,2055],{"class":82},"Math",[37,2057,92],{"class":74},[37,2059,2060],{"class":95},"clamp",[37,2062,192],{"class":74},[37,2064,2065],{"class":121},"150",[37,2067,321],{"class":74},[37,2069,122],{"class":121},[37,2071,321],{"class":74},[37,2073,762],{"class":121},[37,2075,543],{"class":74},[37,2077,2078],{"class":51},"                 \u002F\u002F 100\n",[37,2080,2081],{"class":39,"line":225},[37,2082,468],{"emptyLinePlaceholder":467},[37,2084,2085],{"class":39,"line":231},[37,2086,2087],{"class":51},"\u002F\u002F Character\n",[37,2089,2090,2093,2095,2098,2100,2103,2105],{"class":39,"line":237},[37,2091,2092],{"class":82},"Character",[37,2094,92],{"class":74},[37,2096,2097],{"class":95},"isEmoji",[37,2099,192],{"class":74},[37,2101,2102],{"class":121},"0x1F600",[37,2104,543],{"class":74},[37,2106,2107],{"class":51},"              \u002F\u002F true\n",[15,2109,2110,2111,2114,2115,2118],{},"Ayrıca Java 21'de ",[22,2112,2113],{},"Generational ZGC"," geldi: düşük gecikme isteyen uygulamalarda ",[34,2116,2117],{},"-XX:+UseZGC -XX:+ZGenerational"," ile denenebilir.",[10,2120,2122],{"id":2121},"_8-önizleme-preview-özellikleri","8. Önizleme (preview) özellikleri",[15,2124,2125,2126,2129],{},"Bazı özellikler Java 21'de sadece önizleme olarak bulunur ve ",[34,2127,2128],{},"--enable-preview"," ile açılır: string templates (daha sonra geri çekildi), unnamed classes ve instance main metodu, structured concurrency, scoped values. Production kodunda önizleme özelliklerine güvenmeyin; bir sonraki sürümde değişebilir ya da kaldırılabilirler.",[27,2131,2133],{"className":29,"code":2132,"language":31,"meta":32,"style":32},"javac --release 21 --enable-preview Main.java\njava --enable-preview Main\n",[34,2134,2135,2152],{"__ignoreMap":32},[37,2136,2137,2140,2143,2146,2149],{"class":39,"line":40},[37,2138,2139],{"class":43},"javac",[37,2141,2142],{"class":47}," --release",[37,2144,2145],{"class":121}," 21",[37,2147,2148],{"class":47}," --enable-preview",[37,2150,2151],{"class":47}," Main.java\n",[37,2153,2154,2156,2158],{"class":39,"line":105},[37,2155,44],{"class":43},[37,2157,2148],{"class":47},[37,2159,2160],{"class":47}," Main\n",[10,2162,2164],{"id":2163},"_9-java-17den-21e-geçiş","9. Java 17'den 21'e geçiş",[2166,2167,2168,2181],"table",{},[2169,2170,2171],"thead",{},[2172,2173,2174,2178],"tr",{},[2175,2176,2177],"th",{},"Adım",[2175,2179,2180],{},"Not",[2182,2183,2184,2193,2203,2213,2221,2229],"tbody",{},[2172,2185,2186,2190],{},[2187,2188,2189],"td",{},"JDK",[2187,2191,2192],{},"Temurin, Corretto, Zulu gibi bir OpenJDK 21 dağıtımı kurun",[2172,2194,2195,2198],{},[2187,2196,2197],{},"Maven",[2187,2199,2200],{},[34,2201,2202],{},"\u003Cmaven.compiler.release>21\u003C\u002Fmaven.compiler.release>",[2172,2204,2205,2208],{},[2187,2206,2207],{},"Gradle",[2187,2209,2210],{},[34,2211,2212],{},"java { toolchain { languageVersion = JavaLanguageVersion.of(21) } }",[2172,2214,2215,2218],{},[2187,2216,2217],{},"Spring Boot",[2187,2219,2220],{},"Virtual thread desteği için 3.2+",[2172,2222,2223,2226],{},[2187,2224,2225],{},"Lombok, Mockito, ByteBuddy",[2187,2227,2228],{},"Java 21 destekleyen güncel sürümlere yükseltin",[2172,2230,2231,2234],{},[2187,2232,2233],{},"Docker",[2187,2235,2236,2239],{},[34,2237,2238],{},"eclipse-temurin:21-jre"," gibi bir base image",[10,2241,2243],{"id":2242},"sonuç","Sonuç",[15,2245,2246,2247,2249],{},"Java 21, uzun zamandır beklenen birkaç özelliği tek bir LTS sürümünde birleştiriyor. Records ve sealed tiplerle veriyi daha net modellemek, pattern matching ile ",[34,2248,957],{},"\u002Fcast zincirlerinden kurtulmak ve virtual thread'lerle reaktif koda geçmeden yüksek eşzamanlılık elde etmek mümkün. Java 17 kullanıyorsanız geçiş genelde birkaç bağımlılık güncellemesinden ibarettir; Java 8\u002F11'deyseniz ise atlamak için en iyi hedef budur.",[2251,2252,2253],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":32,"searchDepth":105,"depth":105,"links":2255},[2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266],{"id":12,"depth":105,"text":13},{"id":55,"depth":105,"text":56},{"id":399,"depth":105,"text":400},{"id":671,"depth":105,"text":672},{"id":1027,"depth":105,"text":1028},{"id":1411,"depth":105,"text":1412},{"id":1680,"depth":105,"text":1681},{"id":1962,"depth":105,"text":1963},{"id":2121,"depth":105,"text":2122},{"id":2163,"depth":105,"text":2164},{"id":2242,"depth":105,"text":2243},"2026-11-01","Java 21 LTS ile gelen ve günlük kodu en çok değiştiren özellikler — virtual threads, record'lar, switch pattern matching, record pattern'leri, sealed sınıflar ve sequenced collections.","md",{},"\u002Ftr\u002Fblog\u002Fjava-21-features",{"title":5,"description":2268},"tr\u002Fblog\u002Fjava-21-features",[44,2275],"rehber","\u002Fen\u002Fblog\u002Fjava-21-features","jaGuMpwhacNOwtCVDoVKFziGcX1HFTJb1ghsJ6edktA",[2279,2286,2292],{"path":2280,"title":2281,"description":2282,"date":2283,"tags":2284},"\u002Ftr\u002Fblog\u002Finstall-java-on-centos-7-rhel-7","CentOS 7 & Red Hat Enterprise Linux 7 Java Kurulumu","CentOS 7 ve RHEL 7 üzerine yum ile Java 11 (OpenJDK) kurulumu ve alternatif sürüm seçimi — adım adım kısa rehber.","2019-11-08",[44,2285],"linux",{"path":2287,"title":2288,"description":2289,"date":2290,"tags":2291},"\u002Ftr\u002Fblog\u002Fjava-11-12-13-and-beyond","Java 11-12-13 ve …","Java 11 ve sonrasındaki sürümlerde gelen yenilikler: yeni sürüm döngüsü ve dikkat çeken özellikler.","2019-02-13",[44],{"path":2293,"title":2294,"description":2295,"date":2296,"tags":2297},"\u002Ftr\u002Fblog\u002Fspring-security-primefaces-redirect-issue-fix","Spring Security + PrimeFaces Yönlendirme Problemi Çözümü","Spring Security ile PrimeFaces kullanılırken ortaya çıkan yönlendirme probleminin çözümü.","2015-05-15",[44,2298,2299,2300],"jsf","primefaces","spring",1793491378898]