Apakah itu mungkin?
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 :)
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
nya toString()
metode.
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 kebiasaan java.util.Comparator<T>
untuk menyortir.
Berikut adalah contoh bagaimana Anda dapat mengurutkan String[]
berdasarkan String.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).
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 memfilter Alpha
pada kondisi tertentu. Untuk melakukan ini, Anda dapat menggunakan file Predicate<Alpha>
. Ini adalah antarmuka fungsional yang memiliki metode test
yang menerima Alpha
dan mengembalikan a boolean
.
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
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 dinew
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
bukan cur
dengan print
metode. Katakan TIDAK untuk menangkap final
penduduk lokal yang " secara implisit "? )
node
harus dideklarasikan di final
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
Contoh berikut, HelloWorldAnonymousClasses, menggunakan kelas anonim dalam pernyataan inisialisasi variabel lokal frenchGreeting dan spanishGreeting, tetapi menggunakan kelas lokal untuk inisialisasi variabel englishGreeting:
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.