View Full Version : سوال: Java Closures چیست ؟
dasssnj
جمعه 25 مهر 1393, 05:46 صبح
سلام دوستان .
از عنوان تاپیک معلومه سوالم چیه .Java Closures چیه و چطور میشه ازش در Java SE7 استفاده کرد؟
cups_of_java
جمعه 25 مهر 1393, 14:04 عصر
جاوا هنوز کلوژر ها رو به معنای واقعی پیاده سازی نکرده ولی نمونه هایی افراد مختلفی پیاده سازی کردن مثل این (http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html) که هنوز استاندارد نیست. (اینجا می تونی کلی جزییات پیدا کنی (http://javac.info/)) برنامه جاوا این بوده گویا که فعلن تو نسخه ۸اش عبارات لامبدا رو پیادهسازی کنه و بستر رو برای پیاده سازی کلوژر ها توی زبان جاوا فراهم کنه... شاید تا نسخه های ۹ یا ۱۰ کلوژر ها رو هم ببینیم.
اما داستان این دو تا چیه:
عبارات لامبدا در واقع چیزی جز توابع بی نام نیستن. یعنی یک تکه کد (تابع) که بتونه (مثل دیتا) توی متغیر های ما قرار بگیره و بتونیم تو برنامه جا به جاش کنیم. یعنی به متدها ارسالش کنیم. از متد برشگردونیم و .... که این قدرت زیادی به برنامه نویس میده. خب اونایی که جاوا نویس خوبی هستن حتمن می دونن که این کار رو با کلاس های بی نام (Annonymous Inner Class) توی جاوا میشد انجام داد و خیلی هم یه جاهایی عرف بود و حتمن دیدینش تو کدوتون.... اما انقدر سینتکس این کار ضایع بود و پر از کدای بی ربط (boilerplate) که آخرش مجبور شدن همون عبارات لامبدا را اضافه کنن. اما به خاطر مشکلاتی که تو پیاده سازی برای اولین نسخه بود در واقع با همون کلاس های بی نام یه جورایی پیاده سازیش کردن توی جاوا ۸.
اما کلوژر یه چیزی فراتر از عبارات لامبدا هستش. در واقع تابع بدون نامی هست که فضا و حوزه اجرای اطراف خودش رو محصور میکنه. یعنی یه تابع بی نام که می تونه به متغیر های بیرون خودش دسترسی داشته باشه بعدن.
کلوژر بیشترین قدرت رو به برنامه نویس میده تو رویکرد تابع گرای برنامه نویسی. اما خب توی جاوا هنوز پیاده سازی نشده و شما از توی لامبدا ها فقط می تونی به متغیر های ثابت final دسترسی داشته باشی نه همه متغیر ها
اگه یه چیزی شبیه کلوژر میخواید با کد جاوا ۸ درست کنید اینو که خیلی سادست براتون پیدا کردم:
publicclassTest{
interface MyAdder {
int call( int i ) ;
}
public int adder( int i, MyAdder adder ) {
return adder.call( i ) ;
}
public static void main( String[] args ) {
int v = new Test().adder( 2, (x) -> x + 8 ) ;
System.out.println( v ) ;
} }
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.