JavaRush /مدونة جافا /Random-AR /جافا الجديدة... مرة أخرى... تعرف على Java 10

جافا الجديدة... مرة أخرى... تعرف على Java 10

نشرت في المجموعة
في السابق، كان المطورون ينتظرون جافا جديدة لعدة سنوات، البعض برعب، والبعض بالأمل. لقد تغير الزمن، وستسعدنا الإصدارات الجديدة من JDK كل ستة أشهر. إذا لم يكن من الواضح لك بعد ما سيؤدي إليه ذلك، فاطلع على رأي الخبير ، وسنقوم هنا بإدراج التغييرات الرئيسية في Java 10، الإصدار الأحدث من لغتنا المفضلة. جافا الجديدة... مرة أخرى... تعرف على Java 10 - 1بين قوسين معقوفين قبل "الميزة" الجديدة، تتم الإشارة إلى رقم JEP، أي "JDK Enchancement Proposal". JEP هو اقتراح لتحسين OpenJDK وقد تتم الموافقة عليه أو تأخيره أو رفضه. وهذا هو، في جوهره، مجموعة JEPs هي استراتيجية تطوير لـ OpenJDK.

الميزات الهامة لجافا 10

[286] استدلال نوع المتغير المحلي - اقتراح لإدخال الكلمة الأساسية var في Java، مما يلغي الحاجة إلى تحديد نوع المتغير المحلي بشكل صريح. أي أنه لا يمكنك الآن تحديد نوع المتغير الذي تمت تهيئته، ولكن اكتب شيئًا مثل:
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. في Java 10، سيتم دمج هذه الغابة بأكملها في مستودع واحد لتمكين تنفيذ عمليات الالتزام الذرية عبر مستودعات مجموعات التغييرات المترابطة. [304] واجهة جامع البيانات المهملة ليست واجهة يمكن للمطورين استخدامها للتحكم في جمع البيانات المهملة. بدلاً من ذلك، حصلنا على واجهة نظيفة لأداة تجميع البيانات المهملة في كود مصدر JVM، مما يسمح لك بدمج المجمعات البديلة بسرعة وسهولة. أولئك الذين يحلمون بإضافة أداة تجميع القمامة الخاصة بهم إلى JVM سيكونون سعداء للغاية بهذا التحسين. [307] GC الموازي الكامل لجامع القمامة G1 . في JDK 9، أصبح G1 مجمع البيانات المهملة الافتراضي، بينما كان مجمع البيانات المهملة الافتراضي سابقًا هو Parallel GC، والذي يمكنه جمع البيانات المهملة عبر سلاسل عمليات متعددة. الآن يمكن لـ G1 القيام بذلك أيضًا، حيث كان يفعل ذلك سابقًا في مؤشر ترابط واحد، مما تسبب في بعض الأحيان في صعوبات. بالمناسبة، سيتمكن المطورون من تكوين عدد سلاسل الرسائل باستخدام - XX:ParallelGCThreads. [310] معلمة مشاركة بيانات فئة التطبيق - يوفر هذا التطوير، المعتمد في Java 10، تحميلًا وتتبعًا محسّنين، ويوسع ميزة مشاركة الفئة (CDS) الحالية للسماح بوضع فئات التطبيق في الأرشيف العام. مشاركة بيانات الفئة أو أقراص CDS للأعمال القصيرة مع الملفات ذات ملحق الفئة *. تتيح لك هذه الوظيفة تحديد مجموعة فرعية معينة من الفئات ومعالجتها وضغطها في أرشيف خاص. كل هذا يتم لحفظ الذاكرة. غالبًا ما تقوم مثيلات JVM المختلفة بتحميل نفس الفئات المضمنة في المكتبة القياسية. وتسمح CDS لجميع مثيلات JVM هذه بمشاركة أرشيف واحد مع الفئات الموضوعة فيه. وهذا يقلل من وقت تحميل البرنامج واستخدام الذاكرة. في الواقع، تعمل CDS على تحسين أداء بدء تشغيل JVM وتقليل أثر الموارد عند تشغيل JVMs متعددة على نفس الجهاز الفعلي أو الظاهري، بدءًا من الإصدار 5. ولكن في وقت سابق كان استخدام CDS يقتصر على أداة تحميل التشغيل فقط. الآن هناك نسخة موسعة تسمى Application CDS تسمح لك بتحميل أرشيفات خاصة بفئات للوادر الأخرى. [312] تعد مصافحة مؤشر الترابط المحلي تغييرًا منخفض المستوى إلى حد ما داخل JVM والذي سيسمح بتنفيذ عمليات الاسترجاعات عبر سلاسل الرسائل دون تشغيل نقطة أمان عالمية لـ VM. سيسمح لك هذا بإيقاف سلاسل الرسائل الفردية دون تكلفة، بدلاً من إيقافها مرة واحدة (أو لا شيء على الإطلاق). [313] إزالة أداة إنشاء الرؤوس الأصلية (javah) . بالعودة إلى Java 9، بدأ مطورو اللغة في إزالة الأدوات غير الضرورية بشكل نشط، ويواصل JEP 313 هذا العمل الجيد. تقوم أداة javah بإنشاء رؤوس JNI إذا كانت هناك طرق أصلية في الكود. صحيح؟ بالطبع، لكن مترجم javac الأصلي، بدءًا من JDK 8، يمكنه بنفسه إنشاء رؤوس JNI. والآن قرروا التخلص من جافا. بالمناسبة، يجري حاليا تطوير مشروع بنما ، والذي، على وجه الخصوص، يمكن أن يحل محل JNI. [314] ملحقات علامة لغة Unicode الإضافية يهدف هذا التغيير إلى تحسين فئة java.util.Locale وواجهات برمجة التطبيقات المرتبطة بها لتنفيذ امتدادات Unicode إضافية لعلامات لغة BCP 47. على وجه الخصوص، علامات نوع العملة (cu)، اليوم الأول سيتم الآن دعم تجاوزات الأسبوع (fw) والمنطقة (rg) والمنطقة الزمنية (tz). [316] تخصيص الكومة على أجهزة الذاكرة البديلة سيساعد هذا الابتكار أولئك الذين يستخدمون أنواع ذاكرة أخرى غير DRAM. وبما أن التقنيات تتغير باستمرار، فإن استخدام الذاكرة غير المتطايرة بنفس الواجهة وخصائص الأداء المشابهة للذاكرة الديناميكية الديناميكية (DRAM) أصبح حقيقة موضوعية اليوم. لذلك، يسمح JEP 316 لـ JVM بوضع كومة في أنواع أخرى من الذاكرة. [317] مترجم JIT التجريبي القائم على Java . تم الإعلان مؤخرًا عن مشروع Metropolis، الذي يقترح إعادة كتابة معظم JVM في Java. في حال كنت لا تعرف، الإصدار الحالي مكتوب بلغة C++. حسنا، إذا كنت تعرف بالفعل، فمن المحتمل أن تبدو هذه الفكرة غريبة بالنسبة لك في البداية. نظرًا لأن JVM مكتوب بلغة Java، ألا تحتاج إلى JVM لتشغيل JVM؟ هذا هو العودية التي تذكرنا بالمرايا المقابلة لبعضها البعض. ومع ذلك، فإن الواقع مختلف قليلاً: لمجرد أن JVM مكتوب بلغة Java، فهذا لا يعني أنه يتعين عليك تجميعه في رموز ثانوية. يمكنك بالفعل استخدام تجميع AOT ثم يقوم JIT بتجميع الكود أثناء عمله على تحسين الأداء.

تُستخدم أداة مثل javac بشكل شائع لتجميع تعليمات Java البرمجية. يقوم بتحويل برنامج Java إلى مجموعة من ملفات الفئة ذات الرموز الثانوية. بعد ذلك، يقوم 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. من المحتمل أن تكون هذه الإضافة المفيدة جزءًا مما تفعله Oracle للتأكد من أن ثنائيات OpenJDK وثنائيات Oracle JDK متماثلة وظيفيًا. [322] إصدار الإصدار المستند إلى الوقت - في Java 10، ستتم إضافة ميزات جديدة إلى إصدارات الميزات، وسيتم إصلاح الأخطاء في إصدارات التحديث. في الأساس، لدينا طريقة جديدة لتعيين تنسيقات سلسلة إصدار JDK. إنه يعمل على إصلاح موقف غريب إلى حد ما مع JDK 9. التحديث الأول كان JDK 9.0.1، وهو أمر منطقي تمامًا. التحديث الثاني هو JDK 9.0.4 وهو أمر غير منطقي. المنطق هو أنه ضمن نظام ترقيم إصدارات JDK 9، يتم ترك مسافة بين التحديثات في حالة حدوث تحديث طارئ وغير مخطط له. نظرًا لأن التحديث لم يكن ضروريًا، فلماذا لا نسميه JDK 9.0.2 فقط؟ وإليك الشكل الذي يبدو عليه تنسيق إصدار Java الجديد:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

واجهات برمجة التطبيقات الجديدة

هناك 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): محمل بشكل زائد toString، يحول محتويات المخزن المؤقت إلى سلسلة عن طريق فك تشفير البايتات باستخدام الترميز المحدد.

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

    تحتوي كلتا الفئتين على ثلاث مُنشئات جديدة تأخذ وسيطة إضافية charset.

  • java.io.القارئ:

    long transferTo (Writer): يقرأ جميع الأحرف من هذا القارئ ويكتب الأحرف للكاتب المحدد بالترتيب الذي تمت قراءته به.

  • java.lang.Runtime.Version:

    أربع طرق جديدة تُرجع قيمة عددية للإصدار الجديد (JEP 322) من حقول السلسلة: feature ()و interim ()و patch ()و update ().

  • java.lang.StackWalker.StackFrame:

  • سلسلة getDescriptor ():

    تقوم بإرجاع مؤشر إلى الطريقة التي يمثلها إطار المكدس هذا، كما هو محدد بواسطة مواصفات Java Virtual Machine.

  • سلسلة getMethodType ():

    إرجاعات MethodTypeتمثل أنواع المعلمات ونوع الإرجاع للطريقة التي يمثلها إطار المكدس.

  • java.lang.invoc.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