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.
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;
}
}Jari-jari : 7.0
Luas : 153.94Konstruktor 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.
// 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.
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;
}
}Nilai akhir : 2Pada 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.
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);
}
}
}1. Ali
2. Budi
3. CitraPada 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
thispadahal parameternya bernama sama. Penugasan itu hanya memutar nilai parameter, sedangkan field tetap bernilai bawaan. Tulisthis.namaField = namaParameterpada setiap pengisian semacam ini. - Memakai
thisdi dalam metodestaticataumain. 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 butuhthiske metode instansi. - Menyambung rantai pemanggilan pada metode yang tidak mengembalikan
this. Rantai tersebut gagal dikompilasi karena nilai kembaliannya tidak punya metode berikutnya. Tambahkanreturn thisbila gaya berantai memang dikehendaki. - Menyisipkan
this.pada semua akses field lalu menganggapnya wajib.thishanya diperlukan saat ada ambiguitas dengan parameter atau variabel lokal, sedangkan pemakaiannya di tempat lain sekadar gaya penulisan.
Ringkasan#
thisadalah referensi menuju objek yang sedang menjalankan metode, tersedia otomatis pada setiap metode instansi.this.namaFieldmembedakan field dari parameter atau variabel lokal yang namanya sama, dan penugasan tanpanya berisiko menunjuk diri sendiri.- Metode yang mengembalikan
thismemungkinkan pemanggilan berantai atas objek yang sama. thisdapat dioper sebagai argumen agar objek lain memegang referensi penuh, sedangkan pada metodestatickata kunci ini tidak tersedia.
Referensi#
- Using the this Keyword — Oracle
— penggunaan
thisuntuk field, konstruktor, dan pemanggilan metode. - Primary Expressions, JLS 15.8.3 — Oracle
— spesifikasi resmi makna ekspresi
this.