Kata Kunci Java this: Penggunaan Praktis, Konstruktor, dan Lainnya
Java this Keyword Dijelaskan
Artikel ini membahas kata kunci this di Java, mencakup tujuannya, skenario umum, dan praktik terbaik dengan contoh nyata yang jelas.
Apa Itu this?
Di Java, kata kunci this merujuk pada instance saat ini dari sebuah kelas. Ini paling sering digunakan di dalam instance methods atau konstruktor untuk membedakan antara instance variables dan parameter yang memiliki nama yang sama.
class Main { int instVar; Main(int instVar){ this.instVar = instVar; System.out.println("this reference = " + this); } public static void main(String[] args) { Main obj = new Main(8); System.out.println("object reference = " + obj); } }
Output:
this reference = Main@23fc625e object reference = Main@23fc625e
Kedua this dan variabel obj menunjuk ke instance objek yang sama, mengonfirmasi bahwa this hanyalah referensi ke objek saat ini.
Kapan Menggunakan this
Kata kunci ini sangat berharga dalam beberapa pola pemrograman umum:
Mengatasi Ambiguitas Nama Variabel
Java memungkinkan parameter untuk berbagi nama dengan instance variable, tetapi tanpa this kompiler tidak dapat menentukan yang Anda maksud. Misalnya:
class MyClass { int age; MyClass(int age){ age = age; } }
Dalam konstruktor di atas, age = age menetapkan parameter ke dirinya sendiri, sehingga instance variable tidak berubah. Menggunakan this menjelaskan penetapan:
class Main { int age; Main(int age){ this.age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = " + obj.age); } }
Output:
obj.age = 8
Jika nama parameter berbeda dari instance variable, kompiler secara implisit menggunakan this:
class Main { int age; Main(int i) { age = i; } }
Ini setara dengan this.age = i.
Menggunakan this dalam Getter dan Setter
Setter dan getter sering menerima parameter dengan nama yang sama dengan field. this memastikan variabel yang benar ditargetkan:
class Main { String name; // setter void setName(String name) { this.name = name; } // getter String getName(){ return this.name; } public static void main(String[] args) { Main obj = new Main(); obj.setName("Toshiba"); System.out.println("obj.name: " + obj.getName()); } }
Output:
obj.name: Toshiba
- Menetapkan parameter ke field di dalam setter.
- Mengembalikan nilai field di dalam getter.
Constructor Overloading dengan this()
Saat satu konstruktor perlu mendelegasikan ke konstruktor lain, this() melakukan pemanggilan konstruktor secara eksplisit:
class Complex { private int a, b; private Complex(int i, int j){ this.a = i; this.b = j; } private Complex(int i){ this(i, i); // memanggil konstruktor dua parameter } private Complex(){ this(0); // memanggil konstruktor satu parameter } @Override public String toString(){ return this.a + " + " + this.b + "i"; } public static void main(String[] args) { Complex c1 = new Complex(2, 3); Complex c2 = new Complex(3); Complex c3 = new Complex(); System.out.println(c1); System.out.println(c2); System.out.println(c3); } }
Output:
2 + 3i 3 + 3i 0 + 0i
Poin utama:
- Mengurangi kode duplikat di seluruh konstruktor.
- Hati-hati dengan overhead performa kecil saat merantai konstruktor.
Catatan: Pemanggilan konstruktor eksplisit melalui this() harus menjadi pernyataan pertama dalam konstruktor.
Mengirimkan this sebagai Argumen
Karena this adalah referensi ke objek saat ini, dapat dikirimkan ke metode lain, memungkinkan mereka untuk mengubah status objek:
class ThisExample { int x; int y; ThisExample(int x, int y) { this.x = x; this.y = y; System.out.println("Sebelum mengirimkan this ke metode addTwo():"); System.out.println("x = " + this.x + ", y = " + this.y); add(this); // kirim instance saat ini System.out.println("Setelah mengirimkan this ke metode addTwo():"); System.out.println("x = " + this.x + ", y = " + this.y); } void add(ThisExample o){ o.x += 2; o.y += 2; } } class Main { public static void main(String[] args) { new ThisExample(1, -2); } }
Output:
Sebelum mengirimkan this ke metode addTwo(): x = 1, y = -2 Setelah mengirimkan this ke metode addTwo(): x = 3, y = 0
Di sini, metode add menerima instance objek yang sama dan memperbarui field-nya secara langsung.