Apakah mungkin untuk melewatkan parameter, atau mengakses parameter eksternal ke kelas anonim? Sebagai contoh:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
Apakah ada cara bagi pendengar untuk mengakses myVariable atau diteruskan myVariable tanpa membuat pendengar sebagai kelas bernama sebenarnya?
java
anonymous-class
Lewis
sumber
sumber
final
variabel lokal dari metode melampirkan.this
.Jawaban:
Secara teknis, tidak, karena kelas anonim tidak dapat memiliki konstruktor.
Namun, kelas dapat merujuk variabel dari yang berisi cakupan. Untuk kelas anonim, ini bisa berupa variabel instan dari kelas yang berisi atau variabel lokal yang ditandai sebagai final.
sunting : Seperti yang ditunjukkan Peter, Anda juga dapat meneruskan parameter ke konstruktor superclass dari kelas anonim.
sumber
new ArrayList(10) { }
super()
dan sebelum sisa konstruktor yang sebenarnya.new someclass(){ fields; {initializer} fields; methods(){} }
. Ini semacam penginisialisasi statis tetapi tanpa kata kunci statis. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6Ya, dengan menambahkan metode penginisialisasi yang mengembalikan 'ini', dan segera memanggil metode itu:
Tidak diperlukan deklarasi 'final'.
sumber
final
objek referensi supaya saya bisa mendapatkan info ke kelas anonim saya. Terima kasih sudah berbagi!init()
fungsinya harus kembalithis
? Saya benar-benar tidak mendapatkan sintaks.Iya. Anda dapat menangkap variabel, terlihat oleh kelas dalam. satu-satunya batasan adalah harus final
sumber
this
yang bersifat final.final
? Saya tidak dapat menemukan alternatif. Ini dapat memengaruhi parameter asal yang dirancang untuk menjadifinal
.Seperti ini:
sumber
Ini akan melakukan keajaiban
sumber
Seperti yang ditunjukkan di http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class Anda dapat menambahkan instanceizer. Ini adalah blok yang tidak memiliki nama dan dieksekusi terlebih dahulu (seperti konstruktor).
Sepertinya mereka juga dibahas di inisialisasi Mengapa java Instance? dan Bagaimana penginisiasi instance berbeda dari konstruktor? membahas perbedaan dari konstruktor.
sumber
final
variabel seperti yang dijelaskan oleh aav, tetapi info itu tidak disediakan dalam jawaban ini. Sejauh ini, jawaban terbaik adalah yang diberikan oleh Adam Mlodzinksi (saya sekarang menggunakan pola ini secara eksklusif, tidak ada lagi final!). Saya mendukung komentar saya bahwa ini tidak menjawab pertanyaan yang diajukan.Solusi saya adalah menggunakan metode yang mengembalikan kelas anonim yang diimplementasikan. Argumen reguler dapat diteruskan ke metode dan tersedia dalam kelas anonim.
Misalnya: (dari beberapa kode GWT untuk menangani perubahan kotak teks):
Untuk contoh ini, metode kelas anonim baru akan dirujuk dengan:
ATAU , menggunakan persyaratan OP:
sumber
Orang lain sudah menjawab bahwa kelas anonim hanya dapat mengakses variabel akhir. Tetapi mereka membiarkan pertanyaan terbuka bagaimana menjaga variabel asli non-final. Adam Mlodzinski memberikan solusi tetapi cukup kembung. Ada solusi yang lebih sederhana untuk masalah ini:
Jika Anda tidak ingin
myVariable
menjadi final, Anda harus membungkusnya dalam ruang lingkup baru di mana itu tidak masalah, jika itu final.Adam Mlodzinski tidak melakukan hal lain dalam jawabannya tetapi dengan lebih banyak kode.
sumber
init
metode apa pun . Saya dapat menambahkan satu baris kode tambahan ke contoh saya untuk memiliki variabel tambahan ini. Jika Anda penggemar pola pembangun merasa bebas untuk menggunakannya, tetapi mereka tidak perlu dalam hal ini.final
solusi variabel.Anda dapat menggunakan lambda biasa ("ekspresi lambda dapat menangkap variabel")
atau bahkan sebuah Fungsi
Menggunakan Function adalah cara yang bagus untuk refactor Dekorator dan Adaptor, lihat di sini
Saya baru saja mulai belajar tentang lambdas, jadi jika Anda menemukan kesalahan, jangan ragu untuk menulis komentar.
sumber
Cara sederhana untuk menaruh beberapa nilai ke variabel eksternal (bukan milik kelas anonimus) adalah bagaimana caranya!
Dengan cara yang sama jika Anda ingin mendapatkan nilai dari variabel eksternal Anda dapat membuat metode yang mengembalikan apa yang Anda inginkan!
sumber
Saya pikir kelas anonim pada dasarnya seperti lambdas tetapi dengan sintaks yang lebih buruk ... ini ternyata benar tetapi sintaksnya bahkan lebih buruk dan menyebabkan (apa yang seharusnya) variabel lokal berdarah ke dalam kelas yang mengandung.
Anda tidak dapat mengakses variabel final dengan membuatnya menjadi bidang kelas induk.
Misalnya
Antarmuka:
kelas:
Saya tidak tahu apakah mereka sudah menyelesaikan ini di java 8 (saya terjebak di dunia EE dan belum mendapat 8) tetapi dalam C # akan terlihat seperti ini:
Anda tidak perlu antarmuka terpisah di c # baik ... Saya rindu itu! Saya menemukan diri saya membuat desain yang lebih buruk di java dan mengulangi diri saya sendiri lebih karena jumlah kode + kompleksitas yang harus Anda tambahkan di java untuk menggunakan kembali sesuatu lebih buruk daripada hanya menyalin dan menempel banyak waktu.
sumber