JavaRush /وبلاگ جاوا /Random-FA /جاوای جدید... دوباره... با جاوا 10 آشنا شوید

جاوای جدید... دوباره... با جاوا 10 آشنا شوید

در گروه منتشر شد
پیش از این، توسعه دهندگان چندین سال منتظر جاوای جدید بودند، برخی با ترس و برخی با امید. زمان تغییر کرده است و نسخه های جدید JDK هر شش ماه ما را خوشحال می کند. اگر هنوز برای شما مشخص نیست که این منجر به چه چیزی می شود، نظر متخصص را بررسی کنید ، و در اینجا تغییرات اصلی جاوا 10، جدیدترین نسخه زبان مورد علاقه ما را فهرست می کنیم. جاوای جدید... دوباره... با جاوا 10 - 1 آشنا شویددر پرانتز مربع قبل از "ویژگی" جدید، شماره JEP نشان داده شده است، یعنی "پیشنهاد ارتقای JDK". JEP پیشنهادی برای بهبود OpenJDK است و ممکن است تأیید شود، به تأخیر بیفتد یا رد شود. یعنی در اصل، مجموعه ای از JEP ها یک استراتژی توسعه برای OpenJDK است.

ویژگی های مهم جاوا 10

[286] استنتاج نوع متغیر محلی - پیشنهادی برای معرفی کلمه کلیدی var به جاوا، که نیاز به تعیین صریح نوع یک متغیر محلی را از بین می برد. یعنی اکنون نمی توانید نوع متغیر اولیه را مشخص کنید، اما چیزی شبیه به:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
این کار تکراری بودن تعریف نوع ArrayList<String> را که قبلاً مجبور بودیم استفاده کنیم، حذف می کند. جالب است بدانید var به یک کلمه کلیدی تبدیل نمی شود، بلکه یک نوع رزرو شده است. یعنی می توانید از var به عنوان نام متغیر، متد یا بسته استفاده کنید. اما نمی‌توانید کلاس را به این شکل نامگذاری کنید (چه ضرری!). [296] ادغام جنگل JDK در یک مخزن واحد . JDK 9 دارای هشت مخزن است - root، corba، hotspot، jaxp، jaxws، jdk، langtools، nashorn. در جاوا 10، کل این جنگل در یک مخزن واحد ترکیب می‌شود تا امکان انجام تعهدات اتمی در مخازن مجموعه‌های تغییرات وابسته به یکدیگر را فراهم کند. [304] واسط جمع‌آوری زباله ، رابطی نیست که توسعه‌دهندگان بتوانند از آن برای کنترل جمع‌آوری زباله استفاده کنند. در عوض، ما یک رابط جمع‌آوری زباله تمیز در کد منبع JVM دریافت می‌کنیم که به شما امکان می‌دهد به سرعت و به راحتی جمع‌آورنده‌های جایگزین را ادغام کنید. کسانی که رویای اضافه کردن زباله گرد خود را به JVM داشتند، از این پیشرفت بسیار خوشحال خواهند شد. [307] GC کامل موازی برای جمع‌آوری زباله G1 . در JDK 9، G1 به جمع‌آوری زباله پیش‌فرض تبدیل شد، در حالی که قبلاً جمع‌آوری زباله پیش‌فرض Parallel GC بود که می‌توانست زباله‌ها را در چندین رشته جمع‌آوری کند. اکنون G1 نیز می تواند این کار را انجام دهد؛ قبلاً این کار را در یک رشته انجام می داد که گاهی اوقات باعث ایجاد مشکل می شد. به هر حال، توسعه دهندگان می توانند تعداد رشته ها را با استفاده از پارامتر - XX:ParallelGCThreads. [310] Application Class-Data Sharing پیکربندی کنند - این توسعه، که در جاوا 10 پذیرفته شده است، بارگذاری و ردیابی بهبود یافته را ارائه می دهد، ویژگی اشتراک کلاس (CDS) موجود را گسترش می دهد. اجازه می دهد تا کلاس های برنامه در بایگانی عمومی قرار گیرند. Class-Data Sharing یا CDS برای کارهای کوتاه با فایل هایی با پسوند کلاس *. این تابع به شما امکان می دهد زیرمجموعه خاصی از کلاس ها را انتخاب کنید، آنها را پردازش کرده و در یک آرشیو خاص فشرده کنید. همه اینها برای صرفه جویی در حافظه انجام می شود. اغلب نمونه های مختلف JVM همان کلاس های موجود در کتابخانه استاندارد را بارگذاری می کنند. و CDS به همه این نمونه‌های JVM اجازه می‌دهد تا یک آرشیو واحد را با کلاس‌های قرار داده شده در آن به اشتراک بگذارند. این کار هم زمان بارگذاری برنامه و هم مصرف حافظه را کاهش می دهد. در واقع، CDS عملکرد راه‌اندازی JVM را بهبود می‌بخشد و ردپای منابع را زمانی که چندین JVM در یک ماشین فیزیکی یا مجازی در حال اجرا هستند، از نسخه 5 کاهش می‌دهد. اما قبلاً استفاده از CDS فقط به بوت استرپ لودر محدود می شد. اکنون یک نسخه توسعه یافته به نام Application CDS به شما امکان می دهد آرشیوهای ویژه ای را با کلاس هایی برای بارگذارهای دیگر بارگیری کنید. [312] Thread-Local Handshakes یک تغییر سطح نسبتاً پایین در داخل JVM است که اجازه می‌دهد تا callbackها در سراسر رشته‌ها بدون اجرای یک نقطه ایمنی جهانی VM اجرا شوند. این به شما این امکان را می‌دهد که بدون هزینه، رشته‌های جداگانه را متوقف کنید، نه یک‌باره (یا هیچ‌کدام). [313] ابزار Native-Header Generation Tool (javah) را حذف کنید . در جاوا 9، توسعه دهندگان زبان شروع به حذف فعال ابزارهای غیر ضروری کردند و JEP 313 این کار خوب را ادامه می دهد. اگر متدهای بومی در کد وجود داشته باشد، ابزار جاوا هدرهای JNI را تولید می کند. سالم؟ البته، اما کامپایلر بومی javac، که با JDK 8 شروع می شود، می تواند هدرهای JNI را تولید کند. بنابراین اکنون آنها تصمیم گرفتند که از شر جاوا خلاص شوند. به هر حال، پروژه پاناما در حال حاضر در حال توسعه است ، که به ویژه می تواند جایگزین JNI شود. [314] افزونه‌های برچسب زبان یونیکد اضافی این تغییر به منظور بهبود کلاس java.util.Locale و APIهای مرتبط برای پیاده‌سازی پسوندهای یونیکد اضافی برای برچسب‌های زبان BCP 47. به‌ویژه، برچسب‌ها برای نوع ارز (cu)، روز اول اکنون لغو هفته (fw)، منطقه (rg) و منطقه زمانی (tz) پشتیبانی خواهد شد. [316] تخصیص هیپ در دستگاه های حافظه جایگزین این نوآوری به کسانی که از انواع حافظه غیر از DRAM استفاده می کنند کمک می کند. از آنجایی که فناوری ها دائماً در حال تغییر هستند، استفاده از حافظه غیر فرار با رابط کاربری مشابه و ویژگی های عملکردی مشابه DRAM امروزه یک واقعیت عینی است. بنابراین، JEP 316 به JVM اجازه می دهد تا یک پشته را در انواع دیگر حافظه قرار دهد. [317] کامپایلر JIT مبتنی بر جاوا تجربی . پروژه Metropolis اخیرا اعلام شد که پیشنهاد می‌کند بیشتر JVM در جاوا بازنویسی شود. اگر نمی دانستید، نسخه فعلی به زبان C++ نوشته شده است. خوب، اگر قبلاً می دانید، احتمالاً در ابتدا چنین ایده ای برای شما عجیب به نظر می رسد. از آنجایی که JVM به زبان جاوا نوشته شده است، آیا برای اجرای JVM به JVM نیاز ندارید؟ چنین بازگشتی است که یادآور آینه های روبروی یکدیگر است. با این حال، واقعیت کمی متفاوت است: فقط به این دلیل که JVM در جاوا نوشته شده است، به این معنی نیست که باید آن را به کدهای بایت کامپایل کنید. شما در واقع می توانید از کامپایل AOT استفاده کنید و سپس JIT کد را کامپایل می کند زیرا برای بهبود عملکرد کار می کند.

ابزاری مانند javac معمولا برای کامپایل کد جاوا استفاده می شود. یک برنامه جاوا را به مجموعه ای از فایل های کلاس با کد بایت تبدیل می کند. بعد، JVM بایت کد شما را اجرا می کند و مفسر آن آنها را به دستورالعمل های پردازنده تبدیل می کند. علاوه بر مفسر، JVM یک کامپایلر داخلی نیز دارد و همچنین می تواند دستورالعمل هایی را برای پردازنده از بایت کد ایجاد کند. این به اصطلاح کامپایل زمان اجرا، کامپایل در هنگام راه اندازی است. معمولاً کدی که بیشتر استفاده می شود در معرض چنین جمع آوری قرار می گیرد - این کارایی را بهبود می بخشد.

کامپایلر می‌تواند اقدامات را به روش‌های مختلف انجام دهد: کامپایل JIT (فقط به موقع) - پویا، درست در حین اجرای برنامه، یا کامپایل AOT (پیش از زمان) - قبل از اجرا.

کامپایلر jaotc AOT در JDK 9 معرفی شد. در حال حاضر، Hotspot JVM شامل دو کامپایلر JIT، C1 (برای سرعت) و C2 (برای بهینه‌سازی) است.

JEP 317 پروژه تحقیقاتی Graal را معرفی می کند که یک کامپایلر برای JDK است. این مبنای مشخصی است که به واقعی شدن Metropolis کمک می‌کند و JVM را قادر می‌سازد تا از نظر عملکرد با نسخه فعلی نوشته شده در C++ مطابقت داشته باشد (یا بهتر است از آن فراتر رود). [319] گواهی‌های ریشه مجموعه پیش‌فرض گواهی‌های مرجع گواهی استاندارد (CA) در JDK هستند. مؤلفه های امنیتی حیاتی مانند TLS اکنون به طور پیش فرض در بیلدهای OpenJDK کار می کنند. این افزوده مفید احتمالاً بخشی از کاری است که اوراکل انجام می دهد تا اطمینان حاصل کند که باینری های OpenJDK و باینری های Oracle JDK از نظر عملکردی یکسان هستند. [322] نسخه‌سازی مبتنی بر زمان - در جاوا 10، ویژگی‌های جدیدی به نسخه‌های ویژگی اضافه می‌شود و اشکالات در نسخه‌های به‌روزرسانی برطرف می‌شوند. اساسا، ما یک راه جدید برای تنظیم فرمت های رشته ای نسخه JDK داریم. این یک وضعیت نسبتاً عجیب با JDK 9 را برطرف می کند. اولین به روز رسانی JDK 9.0.1 بود که کاملاً منطقی است. آپدیت دوم JDK 9.0.4 است که غیر منطقی است. منطق این است که در طرح شماره‌گذاری نسخه JDK 9، در صورت بروز یک به‌روزرسانی اضطراری و برنامه‌ریزی نشده، فاصله بین به‌روزرسانی‌ها باقی می‌ماند. از آنجایی که به روز رسانی ضروری نبود، چرا آن را JDK 9.0.2 نمی نامید؟ و فرمت نسخه جدید جاوا به این صورت است:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

API های جدید

73 مورد اضافه شده به کتابخانه های کلاس استاندارد JDK 10 وجود دارد.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): تعیین می کند که کدام کلید اصلاح کننده توسعه یافته، کلید شتاب دهنده مربوط به منوی میانبر باشد.

  • java.awt.geom.Path2D:

    void trimToSize (): ظرفیت این نمونه را Path2Dبه اندازه فعلی آن کاهش می دهد. یک برنامه می تواند از این عملیات برای به حداقل رساندن ذخیره سازی مسیر استفاده کند. همین روش به کلاس های داخلی اضافه شده است Path2D.Doubleو Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): overloaded toString، محتویات یک بافر را با رمزگشایی بایت ها با استفاده از رمزگذاری مشخص شده به یک رشته تبدیل می کند.

  • java.io.PrintStream و lang.io.PrintWriter:

    هر دوی این کلاس ها دارای سه سازنده جدید هستند که یک آرگومان اضافی می گیرند charset.

  • java.io.Reader:

    long transferTo (Writer): همه شخصیت‌های این خواننده را می‌خواند و شخصیت‌ها را به ترتیبی که خوانده می‌شوند برای نویسنده معین می‌نویسد.

  • java.lang.Runtime.Version:

    چهار روش جدید که یک مقدار صحیح را برای نسخه جدید (JEP 322) فیلدهای رشته برمی گرداند: feature (), interim ()و .patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • رشته getDescriptor():

    یک دسته را به روشی که توسط این قاب پشته نشان داده شده است، همانطور که توسط مشخصات ماشین مجازی جاوا تعریف شده است، برمی گرداند.

  • رشته getMethodType():

    برمی گرداند MethodType، که نشان دهنده انواع پارامتر و نوع بازگشتی برای روش نمایش داده شده توسط قاب پشته است.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получor метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / or часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получor новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map or Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если condition выполняется, meaning возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получor три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная version метода replace, которая принимает три параметра Object и возвращает логическое meaning.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-fileми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION