Keputusan nyata jarang berdiri sendiri — kata sandi hanya layak diperiksa setelah nama pengguna dikenali, dan status akun hanya relevan setelah kata sandi cocok. Struktur if di dalam blok if lain, disebut nested if, menggambarkan pertanyaan berjenjang semacam itu: jawaban true pada satu tingkat membuka pertanyaan pada tingkat berikutnya. Struktur bersarang memberdayakan, namun tanpa disiplin cepat menumpuk menjadi piramida kode yang melebar ke kanan dan sulit dibaca. Chapter ini menyusun if bertingkat, lalu memperkenalkan dua teknik perataan — penggabungan kondisi dengan operator && dan guard clause — agar kedalaman logika tidak berubah menjadi kedalaman indentasi.

Menyusun if Bersarang #

Proses login memerlukan tiga pemeriksaan berurutan: nama pengguna, kata sandi, lalu status akun. Setiap pemeriksaan hanya bermakna bila pemeriksaan sebelumnya lolos, sehingga bentuk bersarang memang sesuai:

public class LoginBertingkat {
    public static void main(String[] args) {
        String pengguna = "budi";
        String kataSandi = "rahasia123";
        boolean akunAktif = true;

        if (pengguna.equals("budi")) {
            if (kataSandi.equals("rahasia123")) {
                if (akunAktif) {
                    System.out.println("Login berhasil: selamat datang, Budi!");
                } else {
                    System.out.println("Akun dinonaktifkan, hubungi admin.");
                }
            } else {
                System.out.println("Kata sandi tidak cocok.");
            }
        } else {
            System.out.println("Nama pengguna tidak dikenal.");
        }
    }
}

Output yang Dihasilkan:

text
Login berhasil: selamat datang, Budi!

Mari kita telusuri alurnya tingkat demi tingkat:

  1. Baris 7 (if (pengguna.equals("budi"))): tingkat terluar. JVM membandingkan isi variabel pengguna dengan "budi" memakai method equals — bukan operator == — karena yang dibandingkan adalah isi teks, bukan alamat objek.
  2. Baris 8 (if (kataSandi.equals("rahasia123"))): tingkat kedua. Pemeriksaan ini hanya dieksekusi setelah tingkat pertama bernilai true; nama pengguna yang tidak dikenal membuat seluruh tingkat di dalamnya terlewati.
  3. Baris 9-13 (if (akunAktif) dan else): tingkat ketiga beserta cabang penolakannya. Blok else pada tingkat ini hanya menyatakan akun nonaktif — bukan kegagalan kata sandi.
  4. Baris 15-17 (else tingkat kedua dan ketiga): masing-masing menangani kegagalan pada tingkatnya sendiri. Kejelasan pesan inilah kekuatan bentuk bersarang: setiap cabang tahu persis penyebab kegagalan.

Meratakan dengan Operator Logika #

Perhatikan cabang sukses pada contoh login: ketiga syarat harus true sekaligus, dan cabang gagal tidak lagi membedakan penyebabnya. Bila pesan kegagalan yang terbedakan tidak diperlukan, seluruh menara bersarang dapat diratakan menjadi satu kondisi gabungan dengan operator &&:

public class LoginDiratakan {
    public static void main(String[] args) {
        String pengguna = "budi";
        String kataSandi = "rahasia123";
        boolean akunAktif = true;

        // Tiga syarat digabung menjadi satu kondisi lewat operator &&
        if (pengguna.equals("budi") && kataSandi.equals("rahasia123") && akunAktif) {
            System.out.println("Login berhasil: selamat datang, Budi!");
        } else {
            System.out.println("Kombinasi akun tidak sah.");
        }
    }
}

Output yang Dihasilkan:

text
Login berhasil: selamat datang, Budi!

Baris pertama keluaran program ini identik dengan program bersarang sebelumnya — keputusan akhirnya sama, hanya jalannya yang diratakan. Evaluasi tetap berjalan berurutan dari kiri berkat sifat short-circuit operator &&: begitu satu syarat bernilai false, sisanya tidak pernah dievaluasi, persis seperti tingkat bersarang yang terlewati. Aturan praktisnya sederhana — bila blok dalam hanya berjarak pada kondisi gabungan tanpa aksi khusus per tingkat, gabungkan dengan &&/||; sisakan bentuk bersarang hanya bila setiap tingkat benar-benar membutuhkan aksi atau pesan yang berbeda.

Guard Clause untuk Validasi Awal #

Teknik perataan kedua bekerja dari arah sebaliknya: tolak kasus tidak sah sedini mungkin dengan if kecil yang keluar langsung, sehingga badan utama program tetap rata di satu level indentasi. Pola ini disebut guard clause:

java Validasi dengan guard clause
if (nama == null || nama.isBlank()) {
    System.out.println("Nama wajib diisi.");
    return;
}
if (umur < 17) {
    System.out.println("Umur minimal 17 tahun.");
    return;
}
System.out.println("Formulir " + nama + " siap diproses.");

Potongan di atas memeriksa nama dan umur pada formulir pendaftaran. Statement return mengakhiri eksekusi method main saat itu juga, sehingga setiap syarat gagal berhenti di penjaga terdekatnya. Tanpa guard clause, pemeriksaan yang sama akan membentuk if bersarang dua tingkat yang membungkus seluruh logika pemrosesan — dan setiap syarat baru menambah satu tingkat lagi. Dengan guard clause, setiap aturan berdiri sendiri di level paling kiri, mudah dibaca berurutan dari atas ke bawah.

Nested if, perataan dengan operator logika, dan guard clause melengkapi kotak perkakas pengambilan keputusan kita. Namun rantai else if yang panjang dengan puluhan kemungkinan nilai tetap terasa membosankan — dan di situlah switch berperan. Chapter berikutnya membahas switch statement klasik beserta perilaku fall-through yang wajib dipahami sebelum berganti ke bentuk modernnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

LoginBertingkat.java

Unduh berkas
java
public class LoginBertingkat {
    public static void main(String[] args) {
        String pengguna = "budi";
        String kataSandi = "rahasia123";
        boolean akunAktif = true;

        if (pengguna.equals("budi")) {
            if (kataSandi.equals("rahasia123")) {
                if (akunAktif) {
                    System.out.println("Login berhasil: selamat datang, Budi!");
                } else {
                    System.out.println("Akun dinonaktifkan, hubungi admin.");
                }
            } else {
                System.out.println("Kata sandi tidak cocok.");
            }
        } else {
            System.out.println("Nama pengguna tidak dikenal.");
        }
    }
}

LoginDiratakan.java

Unduh berkas
java
public class LoginDiratakan {
    public static void main(String[] args) {
        String pengguna = "budi";
        String kataSandi = "rahasia123";
        boolean akunAktif = true;

        // Tiga syarat digabung menjadi satu kondisi lewat operator &&
        if (pengguna.equals("budi") && kataSandi.equals("rahasia123") && akunAktif) {
            System.out.println("Login berhasil: selamat datang, Budi!");
        } else {
            System.out.println("Kombinasi akun tidak sah.");
        }
    }
}