Kata Kunci this

Memakai this untuk membedakan field dan parameter, mengembalikan this, dan mengoper this ke metode lain.

Daftar isi

Kata kunci this merujuk pada objek yang sedang menjalankan kode tersebut. Topik ini memakai this dalam tiga peran yang paling sering ditemui, yaitu membedakan field dari parameter yang namanya sama, dikembalikan dari metode agar pemanggilan dapat dirantai, dan dioper ke metode milik objek lain. Pada peran ketiga, penerima mengenal objek pengirim. Ketiga peran itu dibuktikan dengan program yang dapat dijalankan langsung.

Membedakan field dan parameter#

Ambiguitas muncul ketika parameter diberi nama yang sama dengan field, kebiasaan yang justru dipakai luas karena membaca konstruktornya terasa alami. Di dalam tubuh konstruktor, nama polos seperti jariJari selalu berarti parameter, yaitu deklarasi yang paling dekat dengan pemakaiannya, sedangkan this.jariJari berarti field milik objek. Tanpa this, penugasan hanya berputar di antara parameter.

java UjiLingkaran.java
public class UjiLingkaran {

    public static void main(String[] args) {
        Lingkaran lingkaran = new Lingkaran(7);
        System.out.println("Jari-jari : " + lingkaran.jariJari);
        System.out.printf("Luas      : %.2f%n", lingkaran.luas());
    }
}

class Lingkaran {
    double jariJari;

    Lingkaran(double jariJari) {
        this.jariJari = jariJari;
    }

    double luas() {
        return Math.PI * jariJari * jariJari;
    }
}
text Keluaran
Jari-jari : 7.0
Luas      : 153.94

Konstruktor di atas menyimpan nilai parameter ke field lewat this.jariJari = jariJari, sedangkan metode luas() memakai nama polos karena di sana tidak ada parameter yang menaungi, sehingga jariJari jelas berarti field. Versi yang keliru justru terlihat lebih simpel dan tetap lolos kompilasi.

java Contoh: penugasan yang menunjuk dirinya sendiri
// tidak-dijalankan
Lingkaran(double jariJari) {
    jariJari = jariJari;   // parameter mengisi dirinya sendiri, field tak tersentuh
}

Penugasan pada contoh terakhir menyalin nilai parameter ke parameternya sendiri, lalu parameternya musnah bersama frame metode. Field tetap bernilai bawaan 0.0 tanpa pesan error apa pun, dan bug semacam ini baru ketahuan jauh di hilir ketika angka yang dihitung selalu nol. Kompilator modern biasanya memberi peringatan untuk pola ini, tetapi andalannya tetap kebiasaan menuliskan this. pada setiap pengisian field dari parameter.

Mengembalikan this#

Sebagai nilai, this adalah referensi menuju objek pemanggil itu sendiri, sehingga metode boleh mengembalikannya. Metode yang return this menghasilkan objek yang sama, dan pemanggil berikutnya bisa langsung dirangkai pada hasilnya. Pola ini dikenal sebagai pemanggilan berantai (method chaining) dan sering dipakai untuk konfigurasi yang panjang.

java UjiPenghitung.java
public class UjiPenghitung {

    public static void main(String[] args) {
        Penghitung hitung = new Penghitung();
        hitung.naik().naik().naik().turun();
        System.out.println("Nilai akhir : " + hitung.nilai);
    }
}

class Penghitung {
    int nilai;

    Penghitung naik() {
        nilai++;
        return this;
    }

    Penghitung turun() {
        nilai--;
        return this;
    }
}
text Keluaran
Nilai akhir : 2

Pada baris hitung.naik().naik().naik().turun(), setiap pemanggilan menaikkan atau menurunkan nilai pada objek yang sama, lalu mengembalikan objek itu agar panggilan berikutnya punya sasaran. Bila metode naik() dideklarasikan tanpa nilai kembalian, rantai tersebut gagal dikompilasi karena hasil void tidak punya metode naik() untuk dipanggil. Satu return this saja sudah cukup untuk membuka gaya penulisan berantai ini.

Mengoper this ke metode lain#

Peran ketiga adalah memberikan objek saat ini kepada kode lain sebagai argumen. Penerima menerima referensi penuh, sehingga dapat membaca seluruh field dan memanggil metode milik objek tersebut. Pola ini muncul ketika sebuah objek perlu mendaftarkan dirinya, misalnya peserta yang menambahkan diri ke daftar.

java UjiPeserta.java
public class UjiPeserta {

    public static void main(String[] args) {
        DaftarPeserta daftar = new DaftarPeserta();
        new Peserta("Ali").daftar(daftar);
        new Peserta("Budi").daftar(daftar);
        new Peserta("Citra").daftar(daftar);
        daftar.tampilkan();
    }
}

class Peserta {
    String nama;

    Peserta(String nama) {
        this.nama = nama;
    }

    void daftar(DaftarPeserta daftar) {
        daftar.tambah(this);
    }
}

class DaftarPeserta {
    Peserta[] isi = new Peserta[10];
    int jumlah;

    void tambah(Peserta p) {
        isi[jumlah] = p;
        jumlah++;
    }

    void tampilkan() {
        for (int i = 0; i < jumlah; i++) {
            System.out.println((i + 1) + ". " + isi[i].nama);
        }
    }
}
text Keluaran
1. Ali
2. Budi
3. Citra

Pada metode daftar, ekspresi daftar.tambah(this) menyerahkan objek Peserta itu sendiri, bukan sekadar namanya, sehingga DaftarPeserta menyimpan referensi lengkap dan kelak bisa memanggil metode peserta mana pun yang tersimpan. Perhatikan pula baris new Peserta("Ali").daftar(daftar) yang membuat objek tanpa menampung referensinya dalam variabel. Objek tetap hidup karena DaftarPeserta memegang referensinya melalui this, dan hanya objek tanpa satu referensi pun yang kelak dibersihkan oleh garbage collector.

Kesalahan umum#

  • Mengisi field tanpa this padahal parameternya bernama sama. Penugasan itu hanya memutar nilai parameter, sedangkan field tetap bernilai bawaan. Tulis this.namaField = namaParameter pada setiap pengisian semacam ini.
  • Memakai this di dalam metode static atau main. Argumen tersembunyi berisi referensi objek tidak ada di sana, sehingga muncul pesan error “non-static variable this cannot be referenced from a static context”. Pindahkan kode yang butuh this ke metode instansi.
  • Menyambung rantai pemanggilan pada metode yang tidak mengembalikan this. Rantai tersebut gagal dikompilasi karena nilai kembaliannya tidak punya metode berikutnya. Tambahkan return this bila gaya berantai memang dikehendaki.
  • Menyisipkan this. pada semua akses field lalu menganggapnya wajib. this hanya diperlukan saat ada ambiguitas dengan parameter atau variabel lokal, sedangkan pemakaiannya di tempat lain sekadar gaya penulisan.

Ringkasan#

  • this adalah referensi menuju objek yang sedang menjalankan metode, tersedia otomatis pada setiap metode instansi.
  • this.namaField membedakan field dari parameter atau variabel lokal yang namanya sama, dan penugasan tanpanya berisiko menunjuk diri sendiri.
  • Metode yang mengembalikan this memungkinkan pemanggilan berantai atas objek yang sama.
  • this dapat dioper sebagai argumen agar objek lain memegang referensi penuh, sedangkan pada metode static kata kunci ini tidak tersedia.

Referensi#