Ulaşım
- Adres: 2342 Sk, İpekyol, İpek Ap 49A, 63250 Haliliye/Şanlıurfa
- Telefon:
0505 532 36 38 - eMail: admin@alestaweb.com
Java dünyasında Mart 2025'te yayınlanan Java 24 (Oracle JDK 24), Stream API'sini yıllar sonra köklü şekilde değiştiren Stream Gatherers (JEP 485) ile geldi. Artık özel intermediate operations yazabilir, Project Loom ile virtual thread'leri synchronized blok'larda platform thread'i bloklamadan kullanabilir, Class-File API ile bytecode manipülasyonunu standart kütüphaneyle yapabilirsiniz. Alesta Web olarak bu rehberde Java 24'ün geliştirici hayatını değiştiren özelliklerini detaylı işliyoruz.
Java 24, 18 Mart 2025'te resmi olarak yayınlandı (officially released on March 18, 2025). Üç ayda bir gelen Java release döngüsünde olağanüstü dolu bir sürüm — toplam 24 JEP (Java Enhancement Proposal) içeriyor. Bunlardan en dikkat çekici olanları:
Hayır. Java 24 bir non-LTS sürüm. Mevcut LTS sürümü Java 21 (Eylül 2023), bir sonraki LTS Java 25 (Eylül 2025). Production'da LTS kullanın, Java 24 ile yeni özellikleri test edin. Alesta Web önerisi: Java 21 LTS'te kalın, Java 24'ü staging environment'ta test edin, Java 25 LTS çıkınca migration planlayın.
Stream Gatherers, Java 22'de preview, Java 23'te second preview olarak gelmiş, Java 24'te finalize edilmiş bir özellik. Amacı: mevcut intermediate operation'larla (map, filter, flatMap vb.) yapılması zor olan custom transformation'ları (özel dönüşümleri) basit bir API ile sağlamak.
Klasik Stream'de eksik olan neydi? Şu örneklere bakın:
Bunlar mevcut API'de ya mümkün değildi ya da çok zahmetli idi. Gatherers ile artık tek satırda yazılabiliyor.
import java.util.stream.Gatherers;
import java.util.stream.Stream;
// 1. Sliding window (3'lü ardışık gruplar)
List<List<Integer>> windows = Stream.of(1, 2, 3, 4, 5)
.gather(Gatherers.windowSliding(3))
.toList();
// [[1,2,3], [2,3,4], [3,4,5]]
// 2. Fixed grouping (5'er paketler)
List<List<Integer>> chunks = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.gather(Gatherers.windowFixed(5))
.toList();
// [[1,2,3,4,5], [6,7,8,9,10]]
// 3. Fold (running aggregate)
List<Integer> cumulative = Stream.of(1, 2, 3, 4, 5)
.gather(Gatherers.fold(() -> 0, Integer::sum))
.toList();
// [1, 3, 6, 10, 15]
// 4. Scan
List<String> scanned = Stream.of("a", "b", "c")
.gather(Gatherers.scan(() -> "", String::concat))
.toList();
// ["a", "ab", "abc"]
Built-in gatherers'ın ötesinde, kendi gatherer'ınızı yazabilirsiniz. Alesta Web rehberinde sıkça karşılaşılan bir senaryoyu örnekleyelim: art arda tekrar eden değerleri tek sefere indirgemek (consecutive distinct).
import java.util.stream.Gatherer;
public class Gatherers2 {
public static <T> Gatherer<T, ?, T> distinctConsecutive() {
return Gatherer.ofSequential(
// initializer: previous value holder
() -> new Object[]{null},
// integrator: her eleman için çağrılır
(state, element, downstream) -> {
if (!java.util.Objects.equals(state[0], element)) {
state[0] = element;
return downstream.push(element);
}
return true;
}
);
}
}
// Kullanım:
List<Integer> result = Stream.of(1, 1, 2, 2, 2, 3, 1, 1, 4)
.gather(Gatherers2.distinctConsecutive())
.toList();
// [1, 2, 3, 1, 4]
Gatherer'ın dört bileşeni var:
Stream Gatherers, ekosistem kütüphanelerine (Vavr, jOOL gibi) olan bağımlılığı azaltıyor. Alesta Web projelerimizde bir veri pipeline'ında third-party stream extension'lardan vazgeçtik — sadece standart JDK ile aynı işi yapıyoruz. Daha az dependency, daha az güvenlik yüzeyi.
JEP 484 ile Class-File API Java 24'te finalize oldu. Bu API, Java bytecode okumak, yazmak ve modifiye etmek için standart, immutable, modern bir API sunuyor. Daha önce bunun için ASM, BCEL, Javassist gibi third-party kütüphanelere ihtiyacımız vardı.
import java.lang.classfile.*;
import java.nio.file.*;
// Bir class dosyasını okuma ve metot adlarını listeleme
Path classPath = Paths.get("MyClass.class");
ClassModel classModel = ClassFile.of().parse(classPath);
System.out.println("Class: " + classModel.thisClass().asInternalName());
for (MethodModel method : classModel.methods()) {
System.out.println(" Method: " + method.methodName().stringValue() +
" " + method.methodType().stringValue());
}
// Yeni class oluşturma (programatik bytecode üretimi)
byte[] bytes = ClassFile.of().build(
ClassDesc.of("com.example.Generated"),
classBuilder -> classBuilder
.withFlags(ClassFile.ACC_PUBLIC)
.withMethodBody("hello", MethodTypeDesc.of(ConstantDescs.CD_String),
ClassFile.ACC_PUBLIC | ClassFile.ACC_STATIC,
codeBuilder -> codeBuilder
.ldc("Hello from Alesta Web!")
.areturn())
);
Avantajlar:
Framework geliştiricileri için kritik: Spring, Hibernate, Quarkus gibi büyük framework'ler kademeli olarak ASM yerine Class-File API'ye geçiyor.
Java 21 LTS ile gelen virtual threads'in tek büyük eksiği vardı: synchronized bloklarda kullanıldıklarında platform thread'i pinleyebiliyorlardı (could pin platform threads). Bu, milyonlarca virtual thread'i destekleme vaadinin önündeki en büyük engeldi.
Java 24 (JEP 491) bu sorunu çözdü. Artık virtual thread'ler synchronized içinde de pin olmadan çalışıyor (no pinning in synchronized blocks).
// Java 21'de SORUN (pinning oluyordu)
public synchronized void handleRequest(Request req) {
var result = httpClient.send(req); // ← burada virtual thread pin olurdu
process(result);
}
// Java 24'te NORMAL DAVRANIR
public synchronized void handleRequest(Request req) {
var result = httpClient.send(req); // ← virtual thread park olur, başka task çalışır
process(result);
}
Eğer java.util.concurrent.locks.ReentrantLock yerine synchronized kullanmak için kodunuzu refactor etmiştiniz, bu değişiklik artık gereksiz. Alesta Web bir müşteri projesinde 200+ yerde Lock'a geçmiştik — Java 24'e taşıyınca yarısını synchronized'a geri çevirdik, kodun okunabilirliği arttı.
Java 24 ile birlikte NIST tarafından standardize edilmiş iki quantum-resistant algoritma JDK'ya geldi:
Quantum computer'ların ileride RSA ve ECDSA gibi mevcut cryptographic algoritmaları kırma riski var. ML-KEM ve ML-DSA bu tehdide karşı dirençli (resistant).
import java.security.*;
// Key generation
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ML-KEM");
kpg.initialize(NamedParameterSpec.ML_KEM_768);
KeyPair kp = kpg.generateKeyPair();
// Encapsulation (göndericinin tarafı)
KEM kem = KEM.getInstance("ML-KEM");
KEM.Encapsulator enc = kem.newEncapsulator(kp.getPublic());
KEM.Encapsulated encapsulated = enc.encapsulate();
byte[] sharedSecret = encapsulated.key().getEncoded();
byte[] ciphertext = encapsulated.encapsulation();
// Decapsulation (alıcının tarafı)
KEM.Decapsulator dec = kem.newDecapsulator(kp.getPrivate());
SecretKey recoveredKey = dec.decapsulate(ciphertext);
Alesta Web notu: Şimdiden post-quantum'a geçmek zorunda değilsiniz, ancak yeni geliştirilecek long-term gizlilik içeren sistemler için (banking, healthcare, government) ML-KEM ve ML-DSA'yı tanımak ve crypto-agility yaklaşımıyla mimari kurmak gerekiyor.
# 1. pom.xml / build.gradle güncelle <maven.compiler.source>24</maven.compiler.source> <maven.compiler.target>24</maven.compiler.target> # 2. JDK 24 yükle (SDKMAN) sdk install java 24-oracle sdk use java 24-oracle # 3. Bağımlılıkları güncelle (Spring, Hibernate vb.) mvn versions:display-dependency-updates # 4. Test ile çalıştır mvn clean verify # 5. Production deploy
Alesta Web tavsiyesi: Production'da Java 21 LTS'te kalın. Java 24'ü dev/staging'de deneyimleyin. Java 25 LTS (Eylül 2025) çıkınca planlı migration yapın. Java 24'ün desteği yalnızca 6 aydır — production için riskli.
Alesta Web olarak Java 24'ün tüm major özelliklerini kendi test ortamlarımızda doğruladık.
Java 24, Stream Gatherers, Class-File API, virtual thread iyileştirmeleri ve post-quantum cryptography ile modern JVM ekosisteminin sınırlarını genişletti. Production'da Java 21 LTS'te kalın, Java 25 LTS'e hazırlık için Java 24'ü tanıyın. Alesta Web rehberi ile JVM ekosisteminde önde olun.
Hızlı Özet / Quick Summary:
Faydalı Linkler / Useful Links:
© 2026 Alesta Web — Tüm hakları saklıdır.