Contoh:
public class TestClass {
public static void main(String[] args) {
TestClass t = new TestClass();
}
private static void testMethod() {
abstract class TestMethod {
int a;
int b;
int c;
abstract void implementMe();
}
class DummyClass extends TestMethod {
void implementMe() {}
}
DummyClass dummy = new DummyClass();
}
}
Saya menemukan bahwa potongan kode di atas benar-benar legal di Java. Saya memiliki pertanyaan berikut.
- Apa gunanya memiliki definisi kelas di dalam metode?
- Akankah file kelas dibuat untuk
DummyClass
- Sulit bagi saya untuk membayangkan konsep ini dengan cara Berorientasi Objek. Memiliki definisi kelas di dalam sebuah perilaku. Mungkin seseorang bisa memberi tahu saya dengan contoh dunia nyata yang setara.
- Kelas abstrak di dalam sebuah metode terdengar agak gila bagi saya. Tapi tidak ada antarmuka yang diizinkan. Apakah ada alasan dibalik ini?
java
class
local-class
bragboy
sumber
sumber
Jawaban:
Ini disebut kelas lokal.
2 adalah cara yang mudah: ya, file kelas akan dibuat.
1 dan 3 adalah jenis pertanyaan yang sama. Anda akan menggunakan kelas lokal di mana Anda tidak perlu membuat instance atau mengetahui tentang detail implementasi di mana pun kecuali dalam satu metode.
Penggunaan tipikal akan membuat implementasi sekali pakai dari beberapa antarmuka. Misalnya Anda akan sering melihat sesuatu seperti ini:
Jika Anda perlu membuat banyak dari ini dan melakukan sesuatu dengannya, Anda dapat mengubahnya menjadi
Mengenai antarmuka: Saya tidak yakin apakah ada masalah teknis yang membuat antarmuka yang ditentukan secara lokal menjadi masalah bagi kompiler, tetapi bahkan jika tidak ada, mereka tidak akan menambah nilai apa pun. Jika kelas lokal yang mengimplementasikan antarmuka lokal digunakan di luar metode, antarmuka akan menjadi tidak berarti. Dan jika kelas lokal hanya akan digunakan di dalam metode, baik antarmuka dan kelas akan diimplementasikan dalam metode itu, sehingga definisi antarmuka akan menjadi berlebihan.
sumber
parameter
atas mungkin dideklarasikan dalam metode penutup, dan dapat diakses oleh kedua utas.Itu disebut kelas lokal . Anda dapat menemukan penjelasan rinci dan contohnya di sini . Contoh mengembalikan implementasi spesifik yang tidak perlu kita ketahui di luar metode.
sumber
Kelas tidak dapat dilihat (misalnya, metode yang diakses tanpa Refleksi) dari luar metode. Selain itu, ia dapat mengakses variabel lokal yang ditentukan dalam testMethod (), tetapi sebelum definisi kelas.
Saya benar-benar berpikir: "Tidak ada file seperti itu yang akan ditulis." sampai saya baru mencobanya: Oh ya, file seperti itu dibuat! Ini akan disebut sesuatu seperti A $ 1B.class, di mana A adalah kelas luar, dan B adalah kelas lokal.
Khususnya untuk fungsi callback (event handler di GUI, seperti onClick () saat Tombol diklik, dll.), Biasanya menggunakan "kelas anonim" - pertama-tama karena Anda bisa mendapatkan banyak dari mereka. Tetapi terkadang kelas anonim tidak cukup baik - terutama, Anda tidak dapat mendefinisikan konstruktor padanya. Dalam kasus ini, metode kelas lokal ini bisa menjadi alternatif yang baik.
sumber
TestClass$1TestMethodClass.class
, sejalan dengan bagaimana.class
file kelas dalam diberi nama.Tujuan sebenarnya dari ini adalah untuk memungkinkan kita membuat kelas inline dalam pemanggilan fungsi untuk menghibur kita yang suka berpura-pura bahwa kita sedang menulis dalam bahasa fungsional;)
sumber
Satu-satunya kasus ketika Anda ingin memiliki fungsi kelas dalam vs kelas anonim (alias penutupan Java) adalah ketika kondisi berikut terpenuhi
Misalnya seseorang menginginkan
Runnable
dan Anda ingin merekam saat eksekusi telah dimulai dan diakhiri.Dengan kelas anonim tidak mungkin dilakukan, dengan kelas dalam Anda dapat melakukan ini.
Berikut adalah contoh yang menunjukkan maksud saya
Sebelum menggunakan pola ini, harap evaluasi apakah kelas tingkat atas lama biasa, atau kelas dalam, atau kelas dalam statis adalah alternatif yang lebih baik.
sumber
Alasan utama untuk mendefinisikan kelas dalam (di dalam metode atau kelas) adalah untuk menangani aksesibilitas anggota dan variabel dari kelas dan metode yang melingkupinya. Kelas dalam dapat mencari anggota data pribadi dan mengoperasikannya. Jika dalam suatu metode itu dapat menangani variabel lokal akhir juga.
Memiliki kelas batin memang membantu memastikan kelas ini tidak dapat diakses oleh dunia luar. Ini berlaku terutama untuk kasus pemrograman UI di GWT atau GXT dll di mana kode penghasil JS ditulis dalam java dan perilaku untuk setiap tombol atau acara harus ditentukan dengan membuat kelas anonim
sumber
Saya telah menemukan contoh yang bagus di musim semi. Framework ini menggunakan konsep definisi kelas lokal di dalam metode untuk menangani berbagai operasi database dengan cara yang seragam.
Asumsikan Anda memiliki kode seperti ini:
Pertama-tama mari kita lihat implementasi dari execute ():
Harap perhatikan baris terakhir. Spring melakukan "trik" yang tepat ini untuk metode lainnya juga:
"Trik" dengan kelas lokal memungkinkan kerangka kerja untuk menangani semua skenario tersebut dalam satu metode yang menerima kelas tersebut melalui antarmuka StatementCallback. Metode tunggal ini bertindak sebagai jembatan antara tindakan (mengeksekusi, memperbarui) dan operasi umum di sekitarnya (misalnya eksekusi, manajemen koneksi, terjemahan kesalahan dan keluaran konsol dbms)
sumber