Fitur Java Modern: var, Text Block, Sealed & Pattern Matching
Kode Java yang lebih ringkas dengan var, text block, instanceof pattern, sealed interface, record pattern, dan switch dengan pola.
Java tidak lagi bertele-tele
Java dulu dikenal panjang dan kaku. Sejak Java 10 hingga 21, bahasa ini menambah banyak fitur yang membuat kode lebih ringkas tanpa kehilangan keamanan tipe. Bab ini merangkum yang paling berguna.
| Fitur | Versi |
|---|---|
var | Java 10 |
| Switch expression | Java 14 |
| Text block | Java 15 |
| Record | Java 16 |
| instanceof pattern | Java 16 |
| Sealed class/interface | Java 17 |
| Switch dengan pola & record pattern | Java 21 |
var: tipe lokal disimpulkan
var nama = "Budi"; // String
var umur = 25; // int
var daftar = new ArrayList<String>(); // ArrayList<String>
for (var item : daftar) { ... }
Java tetap bertipe statis; compiler yang menebak tipenya. Aturan: hanya untuk variabel lokal yang langsung diberi nilai (bukan field, parameter, atau tipe kembalian). Pakai bila tipenya sudah jelas dari ruas kanan.
Text block: teks banyak baris
String json = """
{
"nama": "Budi",
"umur": 25
}
""";
Diawali dan diakhiri """. Tidak perlu \n atau escape untuk tanda kutip. Indentasi umum otomatis dibuang berdasarkan posisi """ penutup. Sangat cocok untuk JSON, SQL, dan HTML.
instanceof pattern: cek tipe sekaligus cast
// Cara lama
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// Cara baru
if (obj instanceof String s) {
System.out.println(s.length()); // s langsung tersedia
}
if (obj instanceof String s && s.length() > 3) { ... }
Sealed: batasi siapa yang boleh mewarisi
Dengan sealed kamu menentukan daftar tertutup subtipe. Compiler jadi tahu semua kemungkinan.
public sealed interface Bentuk permits Lingkaran, Persegi {}
public record Lingkaran(double jariJari) implements Bentuk {}
public record Persegi(double sisi) implements Bentuk {}
Subtipe harus berstatus final (record otomatis final), sealed lagi, atau non-sealed.
Switch dengan pola (Java 21)
static double luas(Bentuk b) {
return switch (b) {
case Lingkaran l -> Math.PI * l.jariJari() * l.jariJari();
case Persegi p -> p.sisi() * p.sisi();
}; // tanpa default: compiler memastikan semua kasus tercakup
}
Karena Bentuk sealed, compiler memeriksa bahwa semua subtipe sudah ditangani. Bila nanti kamu menambah Segitiga dan lupa menangani, kode gagal dikompilasi — bug tertangkap lebih awal. (Di Java 17 fitur ini masih preview; jalankan dengan Java 21 ke atas.)
Record pattern (Java 21)
Membongkar record langsung di pola:
if (b instanceof Persegi(double sisi)) {
System.out.println("Sisi: " + sisi);
}
return switch (b) {
case Lingkaran(double r) -> Math.PI * r * r;
case Persegi(double s) -> s * s;
};
Guard dengan when
String kategori = switch (obj) {
case Integer i when i < 0 -> "negatif";
case Integer i -> "angka";
case String s -> "teks " + s.length();
case null -> "kosong";
default -> "lainnya";
};
Fitur kecil yang berguna
List.of(...),Map.of(...),Set.of(...)— koleksi immutable ringkas."abc".repeat(3)," x ".strip(),"".isBlank()— tambahan method String.stream.toList()— tanpaCollectors(Java 16).- Helpful NullPointerException — pesan error menyebut persis variabel mana yang null.
Versi mana yang dipakai?
Gunakan versi LTS: 17 atau 21. Kode di bab ini berjalan di Java 17 kecuali bagian "Switch dengan pola" dan "record pattern" yang memerlukan Java 21. Periksa dengan java -version.
Error umum
'var' is not allowed here→ dipakai pada field/parameter, atau tanpa nilai awal.the switch expression does not cover all possible input values→ ada subtipe yang belum ditangani; tambahkan case ataudefault.class is not allowed to extend sealed class→ subtipe tidak tercantum dipermits.