سلام
در این پست میخام درباره ی ایونت هندلینگ در جاوا با استفاده از Anonymous class توضیحاتی بدم.
به قطعه کد زیر نگاه کنید.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class Main {
public static void main(String[] args) {
JButton btn = new JButton();
btn.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hello World!");
}
});
}
}
همه ی ما می دونیم که اینترفیس در جاوا قابل نمونه سازی (instantiation) نیست. یعنی از یک اینترفیس نمی توانیم با استفاده از کلیدواژه new یک آبجکت بسازیم.
به عبارت دیگر چنین چیزی در جاوا ممکن نیست
ActionListener object = new ActionListener(); //اکشن لیسنر یک اینترفیس هست
و همچنین می دانیم که اگر یک متغیر از نوع اینترفیس ایجاد کردیم، تنها مقداری که میتواند داخل آن متغیر قرار بگیرد، یک آبجکت از کلاسی است که حتما آن اینترفیس را پیاده سازی (implement) کرده باشد. به عبارت دیگر، کد زیر در جاوا کاملا ممکن است (به شرطی که myClass حتما ActionListener رو implement کرده باشد)
ActionListener object = new myClass();
اما اگر به کدی که در ابتدای این پست نوشتم نگاه کنید می بینید که با استفاده از new از اینترفیس ActionListener یک آبجکت ساخته شده! چطور چنین چیزی ممکنه؟
در جواب باید گفت که کلید واژه ی new در واقع از اینترفیس آبجکت نساخته، بلکه یک Anonymous class ساخته که این Anonymous class اکشن لیسنر رو implement کرده
سینتکسش خیلی عجیبه نه؟ برای من هم خیلی عجیبه ولی چه میشه کرد، سازندگان جاوا اینجوری ساختنش.
در نگاه اول شاید برای برنامه نویسان تازه کار کمی گیج کننده باشه و اینطور فکر کنن که new مربوط به ActionListener هست، ولی ما در جاوا مفهومی داریم به نام Anonymous class یا کلاس ناشناس
میخام کد بالا رو یه مقدار ساده تر بنویسم.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class Main {
public static void main(String[] args) {
ActionListener myListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Hello World!");
}
};
JButton btn = new JButton();
btn.addActionListener(myListener);
}
}
این کد در واقع همون کد بالایی هست ولی یه مقدار ساده تر نوشته شده. اینجا هم ما یک Anonymous class داریم که همزمان هم کلاس تعریف شده و هم ActionListener رو implement کرده، و هم یک آبجکت ازش ساخته شده و داخل متغیر myListener قرار گرفته
اگر بخوام باز هم کد بالایی رو ساده تر بنویسم، میشه اینجوری (دقت کنید که کد پایینی معتبر نیست و اجرا نمیشه و فقط برای درک بهتر شما اینجوری نوشتم)
ActionListener myListener = new myClass implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Hello World!");
}
};
خب، این پست همینجا به پایان رسید، امیدوارم چیزی به معلومات شما اضافه شده باشه، درباره انانیموس کلس ها حتما مطالعه کنید