Operator Java Diamond:Menyederhanakan Generik di Java 7+
Operator Berlian Java
Operator berlian diperkenalkan di Java 7 untuk membuat kode lebih mudah dibaca untuk Generik. Generik adalah jenis argumen. Dengan menggunakan generik kita dapat meneruskan objek apa pun untuk diproses oleh metode kelas. Misalnya, jika kita membuat daftar string sebelum Java 7, maka kita harus menggunakan sintaks berikut untuk membuat instance daftar string dengan objek ArrayList.
List<String> listOfStrings = new ArrayList<String>();
Mulai Java 7 dan seterusnya, kita dapat menggunakan operator berlian untuk menyederhanakan sintaks di atas sebagai berikut −
List<String> listOfStrings = new ArrayList<>();
Tapi itu tidak bisa digunakan dengan kelas dalam Anonymous. Misalnya, kami tidak dapat menghilangkan jenis objek dari operator berlian dalam sintaksis di bawah ini sebelum Java 9.
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Operator Berlian di Kelas Anonim
Di Java 9, operator berlian juga dapat digunakan dengan kelas anonim untuk menyederhanakan kode dan meningkatkan keterbacaan.
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Operator Berlian di Java 7, Java 8
Dalam contoh di bawah ini, kita telah membuat kelas anonim untuk kelas abstrak Handler yang menerima argumen umum dan meneruskan tipe objek saat membuat kelas anonim karena kita harus meneruskan argumen tipe jika tidak, program tidak akan dapat dikompilasi.
Contoh
public class Tester {
public static void main(String[] args) {
// create an Anonymous class to handle 1
// Here we need to pass Type arguments in diamond operator
// before Java 9 otherwise compiler will complain error
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
// create an Anonymous class to handle 2
Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<Object>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Keluaran
Mari kita kompilasi dan jalankan program di atas, ini akan menghasilkan hasil sebagai berikut −
1
2
Test
Operator Berlian Java 9 dan seterusnya
Dengan Java 9, kita dapat menggunakan operator <> dengan kelas anonim seperti yang ditunjukkan di bawah ini.
Contoh
Dalam contoh di bawah ini, kita telah membuat kelas anonim untuk kelas abstrak Handler yang menerima argumen umum tetapi tanpa tipe objek saat membuat kelas anonim karena kita tidak perlu meneruskan argumen tipe. Kompiler menyimpulkan tipe itu sendiri.
public class Tester {
public static void main(String[] args) {
// create an Anonymous class to handle 1
// Here we do not need to pass Type arguments in diamond operator
// as Java 9 compiler can infer the type automatically
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Keluaran
Mari kita kompilasi dan jalankan program di atas, ini akan menghasilkan hasil sebagai berikut −
1
2
Test