پیش از این، نسخه های جدید جاوا به ندرت و با تاخیر ظاهر می شد. اکنون اوراکل با موفقیت ریتمی را که برای خود تنظیم کرده است حفظ کرده است: «هر شش ماه یک جاوای جدید». بنابراین چند روز پیش، دقیقاً طبق برنامه، بالاخره Java SE 11 و اجرای JDK (کیت توسعه جاوا) را دریافت کردیم. مثل همیشه، نسخه جدید با نسخه های قدیمی سازگار خواهد بود و پشتیبانی از جاوا 11 زودتر از دسامبر 2026 به پایان می رسد.
ویژگی های جدید در Java SE 11 (قابل مشاهده برای توسعه دهندگان)
به یاد بیاورید که در جاوا، تغییرات از طریق اجرای JEP "پیشنهاد ارتقای JDK" انجام می شود. JEP پیشنهادی برای بهبود OpenJDK است و ممکن است تأیید شود، به تأخیر بیفتد یا رد شود. یعنی در اصل، مجموعه ای از JEP ها یک استراتژی توسعه برای OpenJDK است. در پرانتز مربع قبل از "ویژگی" جدید، تعداد JEP مربوطه را نشان خواهیم داد. [323] نحو متغیر محلی برای پارامترهای لامبدا - نحو var برای پارامترهای لامبدا جاوا 10 کلمه کلیدی var را معرفی کرد که امکان تعیین صریح نوع یک متغیر محلی را فراهم کرد. این کد را ساده کرد. JEP 323 استفاده از این نحو را با عبارات لامبدا گسترش می دهد. مثال ساده:list.stream ()
.map ((var s) -> s.toLowerCase ())
.collect (Collectors.toList ());
همانطور که سیمون ریتر ، مبشر معروف جاوا، می نویسد، یک برنامه نویس باتجربه جاوا متوجه خواهد شد که استفاده از var در این مورد ممکن است غیر ضروری باشد، زیرا کد بالا را می توان با کد زیر جایگزین کرد:
list.stream ()
.map (s -> s.toLowerCase ())
.collect (Collectors.toList ());
پس چرا از var پشتیبانی می کنیم؟ فقط یک مورد خاص وجود دارد - زمانی که می خواهید یک حاشیه نویسی به پارامتر لامبدا اضافه کنید. این کار را نمی توان بدون نیاز به نوع خاصی انجام داد، و برای جلوگیری از استفاده از نوع صریح، می توانیم همه چیز را با استفاده از var به این صورت ساده کنیم:
list.stream ()
.map ((@ Notnull var s) -> s.toLowerCase ())
.collect (Collectors.toList ());
[330] راهاندازی برنامههای کد منبع تک فایل تقویت راهانداز جاوا برای راهاندازی یک برنامه بهعنوان یک فایل منفرد با کد منبع جاوا، جاوا اغلب بهخاطر نحو پرمخاطب و «مراسم» چند مرحلهای راهاندازی حتی یک برنامه پیش پا افتاده مورد انتقاد قرار میگیرد. گاهی اوقات این افراد تازه کار را می ترساند. برای نوشتن برنامه ای که به سادگی " Hello World! " را چاپ می کند. "، باید یک کلاس با یک void
متد main static عمومی بنویسید و از System.out.println
. پس از انجام این کار، باید کد را با استفاده از javac کامپایل کنید . در نهایت، پس از این، می توانید برنامه را راه اندازی کنید، که خوشامدگویی بد را نشان می دهد (البته، محیط توسعه یکپارچه، هم IDEA و هم آن چیزی که در JavaRush ساخته شده است ، این "جادوی راه اندازی برنامه" را به تنهایی انجام می دهد - یادداشت ویرایشگر ). بیایید صادق باشیم: در اکثر زبان های برنامه نویسی، اسکریپت واقعی برای اجرای برنامه ها بسیار ساده تر به نظر می رسد. JEP 330 نیاز به کامپایل یک برنامه تک فایلی را از بین می برد، بنابراین اکنون اگر از خط فرمان استفاده می کنید، فقط تایپ کنید
java HelloWorld.java
لانچر جاوا تشخیص می دهد که فایل حاوی کد منبع جاوا است و قبل از اجرای آن کد را در یک فایل کلاس کامپایل می کند. می توانید پارامترها را بعد یا قبل از نام فایل کد منبع قرار دهید. مواردی که بعد از نام قرار می گیرند به عنوان پارامتر هنگام اجرای برنامه ارسال می شوند. مواردی که قبل از نام قرار می گیرند، پس از کامپایل شدن کد، به عنوان پارامتر به لانچر جاوا ارسال می شوند. گزینه های مخصوص کامپایلر (مانند classpath) نیز برای کامپایل به javac ارسال می شود . مثال. خط:
java -classpath / home / foo / java Hello.java Bonjour
معادل این خطوط خواهد بود:
javac -classpath / home / foo / java Hello.java
java -classpath / home / foo / java Hello Bonjour
[321] HTTP Client (استاندارد) - پشتیبانی HTTP Client API استاندارد شده است JDK 9 یک API جدید برای پشتیبانی از پروتکل HTTP Client (JEP 110) معرفی کرد . از آنجایی که JDK 9 سیستم ماژول پلتفرم جاوا (JPMS) را نیز معرفی کرد، این API به عنوان یک ماژول انکوباتور گنجانده شد (اینها ماژول هایی برای ارائه API های جدیدی به توسعه دهندگان هستند که هنوز در Java SE استاندارد نشده اند، در حالی که API های "زنده" در حال استفاده هستند. آماده حذف - توسعه دهندگان می توانند API های جدید را امتحان کنند و سعی کنند بازخورد ارائه کنند). پس از انجام تغییرات لازم (این API در JDK 10 به روز شده است)، API می تواند بخشی از استاندارد شود. بنابراین، HTTP Client API اکنون به طور رسمی در Java SE 11 گنجانده شده است . این یک ماژول و بسته جدید برای JDK، java.net.http معرفی می کند . انواع جدید اصلی عبارتند از: HttpClient HttpRequest HttpResponse WebSocket این API را می توان به صورت همزمان یا ناهمزمان استفاده کرد. در حالت ناهمزمان، CompletionFutures
و استفاده می شود CompletionStages
. [320] حذف ماژول های Java EE و CORBA با معرفی سیستم ماژول پلتفرم جاوا (JPMS) در نسخه نهم جاوا، امکان تقسیم فایل یکپارچه rt.jar به چندین ماژول وجود داشت. علاوه بر این، JPMS به شما این امکان را می دهد که یک محیط زمان اجرا جاوا ایجاد کنید که فقط ماژول های مورد نیاز برنامه شما را شامل می شود و اندازه آن را تا حد زیادی کاهش می دهد. با مرزهای ماژول که به طور شفاف تعریف شده اند، حذف قطعات منسوخ شده از Java API بسیار ساده تر است - این کاری است که JEP 320 انجام می دهد. متامدول java.se.ee شامل شش ماژول است که بخشی از استاندارد Java SE 11 نیستند و شامل نمی شوند. در JDK:
- کوربا
- معامله
- فعال سازی
- xml.bind
- xml.ws
- xml.ws. annotation
API های جدید
تعداد زیادی از APIهای جدید در JDK 11 به لطف گنجاندن ماژول های HTTP Client و Flight Recorder در استاندارد زبان ظاهر شدند . برای فهرست کاملی از APIها، به مقایسه جامع زیر از نسخههای مختلف JDK که توسط Gunnar Morling گردآوری شده است، مراجعه کنید. و در این یادداشت چند روش جدید را که در ماژولهای java.net.http ، jdk.jfr و java.security گنجانده نشدهاند، فهرست میکنیم . java.lang.String مسلما یکی از مهمترین تغییرات String در JDK 11 API، چندین روش مفید جدید وجود دارد.boolean isBlank ()
: اگر رشته خالی باشد یا فقط حاوی فاصله باشد true را برمی گرداند، در غیر این صورت false.Stream lines()
: جریانی از خطوط استخراج شده از این رشته را که با پایان دهنده های خط جدا شده اند، برمی گرداند.String repeat (int)
: رشته ای را برمی گرداند که مقدار آن الحاق آن رشته است که بارهای int تکرار شده است .String strip ()
: رشته ای را با تمام فاصله های قبل یا بعد از اولین کاراکتر غیر فاصله حذف شده برمی گرداند.String stripLeading ()
: رشته ای را با تمام فاصله ها تا اولین کاراکتر غیر فاصله حذف شده برمی گرداند.String stripTrainling ()
: رشته ای را با تمام فاصله هایی که پس از حذف آخرین کاراکتر غیر فاصله رخ می دهد، برمی گرداند.
strip()
این روش قبلاً چیزی مشابه را انجام داده است trim ()
، اما با فاصله این روش ها معنای متفاوتی دارند. در این صورت، trim()
فقط فضاها قطع می شوند، و در strip()
- نیز کاراکترهای خاص، مانند زبانه ها. java.lang.StringBuffer java.lang.StringBuilder هر دوی این کلاس ها حاوی متد جدیدی هستند compareTo ()
که StringBuffer
/ را می پذیرد StringBuilder
و برمی گرداند int
. روش مقایسه واژگانی مشابه روش جدید است compareTo() CharSequence
. java.io.ByteArrayOutputStream
void writeBytes (byte [])
: تمام بایت های پارامتر را در جریان خروجی java.io.FileReader می نویسد
Charset
. java.io.FileWriter چهار سازنده جدید که به شما امکان می دهد Charse
t را مشخص کنید. java.io.InputStream
io.InputStream nullInputStream ()
: برمی گرداندInputStream
که هیچ بایتی را نمی خواند. چگونه از این روش استفاده کنیم؟ میتوانید آن را چیزی مانند /dev/null برای دور انداختن خروجیهایی که به آن نیاز ندارید یا تزریق ورودیهایی که همیشه صفر بایت را برمیگرداند، در نظر بگیرید.
io.OutputStream nullOutputStream ()
io.Reader nullReader ()
io.Writer nullWriter ()
String toString (int)
: این یک روش موجود اضافه بار است، اما به جای char از int استفاده می کند.
int compare (CharSequence, CharSequence)
: از نظر لغوی دو نمونه را با هم مقایسه می کندCharSequence
. اگر دنباله اول از نظر لغوی به ترتیب کمتر، مساوی یا بزرگتر از دومین باشد، مقدار منفی، صفر یا یک مقدار مثبت را برمیگرداند.
lang.Object clone ()
: Simon Ritter مبشر جاوا اعتراف می کند که این روش او را گیج می کند. کلاس
Reference
یک رابط پیاده سازی نمی کند
Cloneable
و این متد همیشه یک استثنا ایجاد می کند
CloneNotSupportedException
. با این حال، متخصص پیشنهاد می کند که این روش برای چیزی در آینده مفید خواهد بود.
runFinalizersOnExit ()
از هر دوی این کلاس ها حذف شده است که ممکن است باعث مشکلات سازگاری شود. java.lang.Thread هیچ روش دیگری وجود ندارد، ما فقط به حذف destroy ()
آنها اشاره می کنیم. stop (Throwable)
با این حال stop ()
، که هیچ استدلالی ندارد، هنوز در دسترس است. لطفاً این را در نظر داشته باشید زیرا ممکن است مشکلات سازگاری وجود داشته باشد. java.nio.ByteBuffer java.nio.CharBuffer java.nio.DoubleBuffer java.nio.FloatBuffer java.nio.LongBuffer java.nio.ShortBuffer در همه این کلاس ها، توسعه دهندگان زبان روشی را اضافه کرده اند mismatch ()
که ایندکس نسبی را پیدا کرده و برمی گرداند. اولین عدم تطابق بین این بافر و بافر معین. java.nio.channels.SelectionKey
int interestOpsAnd (int)
int interestOpsOr (int)
int select (java.util.function.Consumer, long)
: روی کلیدهایی که کانال های مربوطه برای عملیات I/O آماده هستند، یک عمل را انتخاب و اجرا می کند. پارامتر طولانی مدت زمان است.int select (java.util.function.Consumer)
: مانند روش بالا کار می کند، اما بدون تایم اوت.int selectNow (java.util.function.Consumer)
: مانند روش بالا عمل می کند، فقط غیر مسدود کننده است.
String readString (Path)
: تمام محتوا را از یک فایل به یک رشته می خواند، بایت ها را با استفاده از رمزگذاری UTF-8 به کاراکتر رمزگشایی می کند .String readString (Path, Charset)
: مانند روش بالا عمل می کند، اما بایت ها را با استفاده از نویسه ها رمزگشایی می کندCharset
.Path writeString (Path, CharSequence, java.nio.file. OpenOption [])
: اگر دنباله ای از کاراکترها را در یک فایل بنویسیدCharSequence
، آن کاراکترها به بایت کدگذاری می شوند (با استفاده از UTF-8 ).Path writeString (Path, CharSequence, java.nio.file. Charset, OpenOption [])
: مانند روش بالا عمل می کند، فقط کاراکترها با استفاده از بایت کدگذاری می شوندCharset
.
- Path(String, String[]): مسیر را برمیگرداند و یک مسیر یا دنبالهای از رشتهها را تغییر میدهد که وقتی ترکیب میشوند یک مسیر را تشکیل میدهند.
- Path (net.URI): مسیر را با تبدیل URI برمی گرداند.
Object [] toArray (java.util.function.IntFunction)
: یک آرایه حاوی تمام عناصر این مجموعه را با استفاده از تابع مولد ارائه شده برای توزیع آرایه برگشتی برمی گرداند.
void forEach (java.util.function.Consumer)
: عمل مشخص شده را روی هر عنصر تکرارپذیر انجام می دهد تا زمانی که همه عناصر پردازش شوند یا عمل استثنا ایجاد کند.boolean removeAll (java.util.Collection)
: تمام عناصر این مجموعه را که در مجموعه مشخص شده نیز موجود است حذف می کند (عملیات اختیاری).boolean removeIf (java.util.function.Predicate)
: تمام عناصر این مجموعه را که قید داده شده را برآورده می کنند حذف می کند.boolean retainAll (java.util.Collection)
: فقط عناصر موجود در این مجموعه را که در مجموعه مشخص شده موجود است حفظ می کند (عملیات اختیاری).
long convert (java.time.Duration)
: مدت زمان معین را به این واحد تبدیل می کند.
Predicate not(Predicate)
: محمولی را که نفی قید داده شده است برمی گرداند.
lines.stream ()
.filter (s ->! s.isBlank ())
را می توان به این تبدیل کرد:
lines.stream ()
.filter (Predicate.not (String :: ISBLANK))
و اگر از import static استفاده کنیم، این چیزی است که به دست می آوریم:
lines.stream ()
.filter (not(String :: ISBLANK))
java.util.Optional java.util.OptionalInt java.util.OptionalDouble java.util.OptionalLong
boolean isEmpty ()
: اگر مقداری وجود نداشته باشد true و در غیر این صورت false را برمی گرداند .
Predicate asMatchPredicate ()
: متخصص جاوا Simon Ritter معتقد است که ممکن است یک جواهر API واقعی JDK 11 در اینجا پنهان باشد.این روش یک گزاره ایجاد می کند که بررسی می کند آیا این الگو با یک رشته ورودی داده شده مطابقت دارد یا خیر.
int deflate (ByteBuffer)
: داده های ورودی را فشرده می کند و بافر مشخص شده را با داده های فشرده پر می کند.int deflate (ByteBuffer, int)
: داده های ورودی را فشرده می کند و بافر مشخص شده را با داده های فشرده پر می کند. مقدار واقعی داده های فشرده شده را برمی گرداند.void setDictionary (ByteBuffer)
: دیکشنری داده شده را تنظیم می کند تا در بافر داده شده به بایت فشرده شود. این یک اضافه بار از یک روش موجود است که اکنون می تواند یک آرایه را بپذیردByteBuffer
و نه یک آرایه بایت.void setInput (ByteBuffer)
: داده های ورودی را برای فشرده سازی تنظیم می کند. همچنین بارگذاری بیش از حد یک روش موجود است.
int inflate (ByteBuffer)
: بایت ها را در بافر مشخص شده باز می کند. تعداد واقعی بایت های فشرده نشده را برمی گرداند.void setDictionary (ByteBuffer)
: دیکشنری داده شده را روی بایت های موجود در بافر داده شده تنظیم می کند. شکلی پربار از یک روش موجود است.void setInput (ByteBuffer)
: داده های ورودی را برای فشرده سازی تنظیم می کند. شکلی بیش از حد از یک روش موجود.
void addAll (Collection)
: تمام عناصر موجود در مجموعه را اضافه می کند.void addAll (int, Collection)
: تمام عناصر موجود در مجموعه را اضافه می کند که از نمایه مشخص شده شروع می شود.
int [] getSelectedIndices ()
: آرایه ای از تمام شاخص های انتخاب شده در مدل انتخاب شده را به ترتیب صعودی برمی گرداند.int getSelectedItemsCount ()
: تعداد موارد انتخاب شده را برمی گرداند.
shell.JShellException getCause ()
: دلیل قابل پرتاب را در کلاینت اجرایی ارائه شده توسط این EvalException برمی گرداند، یا اگر دلیل وجود نداشته باشد یا ناشناخته باشد، null را برمی گرداند.
ویژگی های غیر توسعه دهنده جاوا 11
[181] کنترل دسترسی مبتنی بر Nest جاوا و سایر زبانها از کلاسهای تودرتو از طریق کلاسهای داخلی پشتیبانی میکنند. برای این کار، کامپایلر باید ترفندهای خاصی را انجام دهد. مثلا:public class Outer {
private int outerInt;
class Inner {
public void printOuterInt() {
System.out.println("Outer int = " + outerInt);
}
}
}
کامپایلر این را تغییر می دهد تا چیزی شبیه به زیر را قبل از کامپایل تولید کند:
public class Outer {
private int outerInt;
public int access$000() {
return outerInt;
}
}
class Inner$Outer {
Outer outer;
public void printOuterInt() {
System.out.println("Outer int = " + outer.access$000());
}
}
اگرچه از نظر منطقی کلاس داخلی بخشی از همان کد کلاس خارجی است، اما به عنوان یک کلاس جداگانه کامپایل می شود. بنابراین، این عملیات به یک متد اتصال مصنوعی نیاز دارد که باید توسط کامپایلر ایجاد شود تا دسترسی به فیلد خصوصی کلاس خارجی فراهم شود. این JEP مفهوم لانهها را معرفی میکند، که در آن دو عضو یک لانه (در مثال ما بیرونی و درونی) دوستان تودرتو هستند. دو ویژگی جدید برای قالب فایل کلاس تعریف شده است: NestHost و NestMembers . این تغییرات برای زبان های دیگری که از کلاس های تودرتو و کد بایت پشتیبانی می کنند مفید است. این تابع سه روش جدید را برای java.lang.Class معرفی می کند : کلاس getNestHost () کلاس [] getNestMembers () بولین isNestmateOf (کلاس) [309] ثابت های Class-File این JEP پسوندی را برای فرمت فایل کلاس برای پشتیبانی از فایل جدید توصیف می کند. استخر پایدار فرم CONSTANT_Dynamic. ایده ثابت پویا مانند یک oxymoron به نظر می رسد، اما اساساً می توانید آن را به عنوان یک مقدار نهایی در جاوا 11 در نظر بگیرید. مقدار ثابت ادغام در زمان کامپایل تنظیم نمی شود (برخلاف سایر ثابت ها)، بلکه از یک بوت استرپ استفاده می کند. روشی برای تعیین مقدار در زمان تحویل بنابراین مقدار پویا است، اما از آنجایی که مقدار آن فقط یک بار تنظیم می شود، آن نیز ثابت است. هدف اصلی این ویژگی افرادی است که زبان ها و کامپایلرهای جدیدی را توسعه می دهند که بایت کدها و فایل های کلاس را به عنوان خروجی برای اجرا در JVM تولید می کنند. [315] بهبود Intrinsics Aarch64 این JEP توسط جامعه Red Hat پیشنهاد شده است. JVM اکنون میتواند از دستورالعملهای تخصصیتر موجود در مجموعه دستورات Arm 64 استفاده کند. به ویژه ، این کار باعث بهبود عملکرد متدها sin ()
و cos ()
کلاس java.lang.Math میشود . [318] Epsilon: A No-Op Garbage Collector همانند JEP 315 ، میتوانید از Red Hat برای معرفی زبالهگیر اپسیلون تشکر کنید. اپسیلون از این جهت غیرعادی است که در واقع زباله را جمع آوری نمی کند! هنگام ایجاد اشیاء جدید، در صورت نیاز حافظه را تخصیص می دهد، اما فضای اشغال شده توسط اشیاء ثبت نشده را بازیابی نمی کند. فایده چیست؟ "، - تو پرسیدی. به نظر می رسد که این "جمع آوری زباله" دو کاربرد دارد: log ()
- اول از همه، این آشغالگیر برای اطمینان از ارزیابی الگوریتمهای جدید GC از نظر تأثیر عملکردشان طراحی شده است. ایده این است که یک برنامه نمونه را با اپسیلون اجرا کنید و مجموعه ای از معیارها را تولید کنید. الگوریتم جدید جمع آوری زباله فعال می شود، همان تست ها اجرا می شود و سپس نتایج مقایسه می شوند.
- برای کارهای بسیار کوتاه (به عملکردهای بدون سرور در فضای ابری فکر کنید) که می توانید تضمین کنید که از حافظه اختصاص داده شده به پشته تجاوز نخواهید کرد. این میتواند با حذف سربار (از جمله جمعآوری آمار مورد نیاز برای تصمیمگیری در مورد اجرای جمعآور) در کد برنامه، عملکرد را بهبود بخشد. اگر فضای پشته تمام شود، JVM ممکن است به یکی از سه روش به اشتباه پیکربندی شود:
- عادی نامیده می شود
OutOfMemoryError
. - ریست هیپ را انجام دهید
- هارد دیسک JVM از کار افتاده است و ممکن است کار دیگری را انجام دهد (مانند راه اندازی دیباگر).
- عادی نامیده می شود
- یک API برای تولید و مصرف داده به عنوان رویداد فراهم می کند
- مکانیزم بافر و فرمت داده باینری را ارائه می دهد
- امکان سفارشی سازی و فیلتر کردن رویدادها را فراهم می کند
- رویدادهایی را برای کتابخانههای OS، JVM HotSpot و JDK فراهم کنید
GO TO FULL VERSION