Apakah itu mungkin?
java
anonymous-function
aarona
sumber
sumber
Jawaban:
jika yang Anda maksud adalah fungsi anonim, dan menggunakan versi Java sebelum Java 8, maka dengan kata lain, tidak. ( Baca tentang ekspresi lambda jika Anda menggunakan Java 8+ )
Namun, Anda dapat mengimplementasikan antarmuka dengan fungsi seperti ini:
Comparator<String> c = new Comparator<String>() { int compare(String s, String s2) { ... } };
dan Anda dapat menggunakan ini dengan kelas dalam untuk mendapatkan fungsi yang hampir anonim :)
sumber
Berikut adalah contoh kelas dalam anonim.
System.out.println(new Object() { @Override public String toString() { return "Hello world!"; } }); // prints "Hello world!"
Hal ini tidak sangat berguna seperti itu, tapi itu menunjukkan bagaimana untuk membuat sebuah instance dari kelas batin anonim yang
extends Object
dan@Override
nyatoString()
metode.Lihat juga
Kelas dalam anonim sangat berguna ketika Anda perlu mengimplementasikan
interface
yang mungkin tidak terlalu dapat digunakan kembali (dan karena itu tidak layak untuk melakukan refactoring ke kelas bernama sendiri). Contoh instruktif adalah menggunakan kebiasaanjava.util.Comparator<T>
untuk menyortir.Berikut adalah contoh bagaimana Anda dapat mengurutkan
String[]
berdasarkanString.length()
.import java.util.*; //... String[] arr = { "xxx", "cd", "ab", "z" }; Arrays.sort(arr, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.length() - s2.length(); } }); System.out.println(Arrays.toString(arr)); // prints "[z, cd, ab, xxx]"
Perhatikan trik perbandingan-pengurangan yang digunakan di sini. Harus dikatakan bahwa teknik ini rusak secara umum: ini hanya berlaku jika Anda dapat menjamin bahwa teknik ini tidak akan meluap (seperti halnya dengan
String
panjang).Lihat juga
sumber
EventListener
(sub) implementasi dalam aplikasi Swing rata-rata.Linked
sidebar, jadi saya melakukan yang terbaik untuk memanfaatkannya.Dengan pengenalan ekspresi lambda di Java 8 Anda sekarang dapat memiliki metode anonim.
Katakanlah saya memiliki kelas
Alpha
dan saya ingin memfilterAlpha
pada kondisi tertentu. Untuk melakukan ini, Anda dapat menggunakan filePredicate<Alpha>
. Ini adalah antarmuka fungsional yang memiliki metodetest
yang menerimaAlpha
dan mengembalikan aboolean
.Dengan asumsi bahwa metode filter memiliki tanda tangan ini:
List<Alpha> filter(Predicate<Alpha> filterPredicate)
Dengan solusi kelas anonim lama, Anda memerlukan sesuatu seperti:
filter(new Predicate<Alpha>() { boolean test(Alpha alpha) { return alpha.centauri > 1; } });
Dengan lambda Java 8, Anda dapat melakukan:
filter(alpha -> alpha.centauri > 1);
Untuk informasi lebih detail, lihat tutorial Lambda Expressions
sumber
Kelas dalam anonim yang mengimplementasikan atau memperluas antarmuka dari tipe yang ada telah dilakukan dalam jawaban lain, meskipun perlu dicatat bahwa beberapa metode dapat diimplementasikan (seringkali dengan kejadian bergaya JavaBean, misalnya).
Sedikit fitur yang dikenali adalah bahwa meskipun kelas dalam anonim tidak memiliki nama, mereka memiliki tipe. Metode baru dapat ditambahkan ke antarmuka. Metode ini hanya dapat dijalankan dalam kasus terbatas. Terutama langsung di
new
ekspresi itu sendiri dan di dalam kelas (termasuk penginisialisasi instance). Ini mungkin membingungkan pemula, tapi bisa "menarik" untuk rekursi.private static String pretty(Node node) { return "Node: " + new Object() { String print(Node cur) { return cur.isTerminal() ? cur.name() : ("("+print(cur.left())+":"+print(cur.right())+")"); } }.print(node); }
(Saya awalnya menulis ini menggunakan
node
bukancur
denganprint
metode. Katakan TIDAK untuk menangkapfinal
penduduk lokal yang " secara implisit "? )sumber
node
harus dideklarasikan difinal
sini.cur
."Node" +
untuk membuat metode kedua diperlukan). / Saya tidak punya nama. Mungkin saya bisa membuat pertanyaan penamaan "polling" (CW), dan memilihnya agar tidak dilupakan.Ya, jika Anda menggunakan java terbaru yaitu versi 8. Java8 memungkinkan untuk mendefinisikan fungsi anonim yang tidak mungkin dilakukan di versi sebelumnya.
Mari kita ambil contoh dari dokumen java untuk mengetahui bagaimana kita dapat mendeklarasikan fungsi anonim, kelas
public class HelloWorldAnonymousClasses { interface HelloWorld { public void greet(); public void greetSomeone(String someone); } public void sayHello() { class EnglishGreeting implements HelloWorld { String name = "world"; public void greet() { greetSomeone("world"); } public void greetSomeone(String someone) { name = someone; System.out.println("Hello " + name); } } HelloWorld englishGreeting = new EnglishGreeting(); HelloWorld frenchGreeting = new HelloWorld() { String name = "tout le monde"; public void greet() { greetSomeone("tout le monde"); } public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } }; HelloWorld spanishGreeting = new HelloWorld() { String name = "mundo"; public void greet() { greetSomeone("mundo"); } public void greetSomeone(String someone) { name = someone; System.out.println("Hola, " + name); } }; englishGreeting.greet(); frenchGreeting.greetSomeone("Fred"); spanishGreeting.greet(); } public static void main(String... args) { HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses(); myApp.sayHello(); } }
Sintaks Kelas Anonim
Pertimbangkan instantiasi objek frenchGreeting:
HelloWorld frenchGreeting = new HelloWorld() { String name = "tout le monde"; public void greet() { greetSomeone("tout le monde"); } public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } };
Ekspresi kelas anonim terdiri dari berikut ini:
new
OperatorNama antarmuka yang akan diterapkan atau kelas yang akan diperluas. Dalam contoh ini, kelas anonim mengimplementasikan antarmuka HelloWorld.
Tanda kurung yang berisi argumen ke konstruktor, seperti ekspresi pembuatan instance kelas normal. Catatan: Saat Anda mengimplementasikan sebuah antarmuka, tidak ada konstruktor, jadi Anda menggunakan sepasang tanda kurung kosong, seperti dalam contoh ini.
Badan, yang merupakan badan deklarasi kelas. Lebih khusus lagi, di bagian body, deklarasi metode diperbolehkan tetapi pernyataan tidak.
sumber