tgoop.com/javapro_ir/4446
Create:
Last Update:
Last Update:
📌 Anonymous Inner Class vs Lambda Expression
🔹 Anonymous Inner Class
* یک کلاس بینام هست که یا یک اینترفیس رو پیادهسازی میکنه یا یک کلاس انتزاعی/معمولی رو extends میکنه.
* میتونه شامل state (فیلدها) و متدهای اضافی باشه.
* هربار که ساخته میشه، واقعاً یک کلاس جدید در بایتکد ایجاد میشه.
🔹 Lambda Expression
* از جاوا 8 معرفی شد.
* فقط میتونه برای Functional Interfaces (اینترفیس با یک متد مجرد) استفاده بشه.
* خودش کلاس جدید تولید نمیکنه، بلکه یک نمونه از اینترفیس تولید میکنه.
* سبکتر و خواناتر از Anonymous Class هست.
📖 مثال ۱: Anonymous Inner Class
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting g = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello from Anonymous Class");
}
};
g.sayHello();
}
}
👉 اینجا یک کلاس بینام ساخته شده که متد sayHello رو پیادهسازی کرده.
📖 مثال ۲: Lambda Expression
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting g = () -> System.out.println("Hello from Lambda");
g.sayHello();
}
}
👉 همین منطق با کدی بسیار کوتاهتر پیادهسازی شد. در واقع نیازی به تعریف کلاس جدید نیست.
📖 تفاوتهای کلیدی
1. محدودیتها
* Anonymous Class میتونه چند متد داشته باشه (حتی متدهای اضافی).
* Lambda فقط برای Functional Interface هست.
2. ساختار بایتکد
* Anonymous Class یک کلاس جداگانه در فایلهای بایتکد تولید میکنه.
* Lambda توسط JVM به شکل یک invokeDynamic ساخته میشه (کلاس واقعی ایجاد نمیکنه).
3. This keyword
* در Anonymous Class، this به نمونهی Anonymous Class اشاره میکنه.
* در Lambda، this به نمونهی کلاس بیرونی اشاره میکنه.
📖 مثال تفاوت this
interface Printer {
void print();
}
public class Main {
public void test() {
// Anonymous Inner Class
Printer p1 = new Printer() {
@Override
public void print() {
System.out.println(this.getClass().getName());
}
};
p1.print();
// Lambda
Printer p2 = () -> {
System.out.println(this.getClass().getName());
};
p2.print();
}
public static void main(String[] args) {
new Main().test();
}
}
👉 خروجی:
* در Anonymous Class: اسم یک کلاس بینام چاپ میشه مثل Main$1.
* در Lambda: اسم کلاس بیرونی (`Main`) چاپ میشه.
✅ جمعبندی
* Anonymous Class
انعطاف بیشتری داره، میشه چند متد نوشت و حتی از کلاسها ارثبری کرد.
* Lambda
سادهتر، سبکتر و خواناتر هست، مخصوص Functional Interfaces.
* تفاوت this خیلی مهمه و توی طراحی تاثیر میذاره.
#کاربرـحرفهـای
🆔 @javapro_ir
🆔 @group_javapro
BY برنامه نویسی جاوا | Java
Share with your friend now:
tgoop.com/javapro_ir/4446