Java 14 قادم



وفقًا لـ Oracle ، من المقرر إصدار Java 14 في 17 مارس. أتساءل عما إذا كان تاريخ الإصدار يتعلق بيوم القديس باتريك (الذي يتم الاحتفال به في هذا اليوم) أم لا ، سنكتشف ذلك قريبًا جدًا. دعونا نلقي نظرة على الابتكارات التي ستكون متاحة في جافا الجديدة ونقرر ما إذا كنا سنشرب البيرة من أجل الفرح أو الحزن.

السجلات


ميزة لغة جديدة بشكل أساسي ، متوفرة في وضع المعاينة في Java 14. والهدف الرئيسي هو التخلص من الكثير من الشعيرية في التعليمات البرمجية. يجب أن تحل السجلات محل الفئات المستخدمة فقط لتخزين البيانات في الحقول دون أي سلوك موصوف. تحديد السجل ، وسوف يولد المحول البرمجي نفسه المنشئ ، getters ، يساوي () وطرق hashCode () ، toString (). في مكان ما رأيناه بالفعل ، أليس كذلك ، السيد لومبوك؟ الإدخال كما يلي:

public record Person(String name, int age){}

من أجل تجميع السجل ، يجب تنزيل jdk14 وإدخال الأمر التالي:

javac —enable-preview —release 14 Person.java

نحن نترجم ونرى ما فعله المترجم:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(java.lang.String name, int age) { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.String name() { /* compiled code */ }

    public int age() { /* compiled code */ }
}

لذا ، بدلاً من التسجيل ، حصلنا على فصل نهائي يرث من فئة السجل التجريدية الجديدة . وكما هو متوقع ، حصلنا على الحروف ، المُنشئ ، يساوي () ، hashCode () ، toString () . لاحظ أنه تم وضع علامة على جميع الحقول على أنها نهائية ، مما يعني أنه لا يمكننا إعادة تعريفها ، ومع ذلك ، فإن التسجيل نفسه لم يتغير تمامًا ، لأن يمكن تخزين الكائنات المخزنة في الحقول. يمكن العثور على مناقشة تفصيلية للتسجيل هنا .

ثرثار NullPointerExceptions


ستكون ودية أكثر NullPointerExceptions . لا ، لا يزال المترجم لا يعرف كيفية إصلاح NPE بالنسبة لنا ، ولكن الآن وصف الاستثناء سيصبح أكثر إفادة. نحن نحاكي الموقف: نسمي NPE في Java 11 و Java 14. على سبيل المثال ، لدينا تركيبة معقدة ، نموذجية من الكيان ، وللحصول على البيانات ، نحتاج إلى استدعاء عدة كائنات من المصدر للوصول إلى الحقل المطلوب ، وهكذا:

var street = message.getAuthor().getAddress().getStreet();

في Java 11 ، نحصل على سجل أخطاء مألوف قديم يترك السؤال الرئيسي: من هو فارغ؟ رسالة ، مؤلف ، عنوان؟

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)

للتشغيل على Java 14 ، تحتاج إلى تجميع الفصل الدراسي بنفس الطريقة مثل التسجيل أعلاه:

javac —enable-preview —release 14 Main.java

ونفّذ بإضافة علامة خاصة:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main

نتيجة للتنفيذ نحصل على الناتج التالي:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)

كما نرى ، أصبحت الرسالة أكثر إفادة ، ويمكننا أن نرى مكان حدوث NPE بالضبط في سلسلة الاتصال .

كتل النص


تتوفر أيضًا كتل النص التي تم تقديمها في Java 13 في Java 14 كميزة معاينة. دعني أذكرك بأن مهمتهم الرئيسية هي تبسيط العمل بالحروف متعددة الأسطر. ميزة مريحة للغاية لكتابة استعلامات SQL ، كود HTML ، JSON . أعتقد أن هذه إحدى الميزات التي ستصبح مفيدة جدًا. أذكر بناء الجملة. على سبيل المثال ، نحتاج إلى كتابة استعلام SQL . قبل Java 13 ، كنا نستخدم سلسلة متسلسلة لكتابة استعلام قابل للقراءة ، وسيبدو الاستعلام على النحو التالي:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";

بدءًا من Java 13 ، يمكننا استخدام كتلة نصية بكتابة سطر بين علامات الاقتباس المزدوجة الثلاثية مثل هذا:


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;

تضيف Java 14 محددين جديدين يمكن استخدامهما في كتل النص. الأول هو مسافة واحدة: \ s . والثاني هو حرف السطر الجديد: \ .

تبديل التعبيرات


بدءًا من Java 14 ، ينتقل تبديل التعبيرات من ميزة المعاينة إلى ميزة كاملة. دعونا نتذكر بإيجاز ميزات المشغل الجديد:

  • بناء الجملة لامدا
  • القدرة على استخدام أكثر من تعبير في حالة
  • إخراج خطأ في حالة عدم اكتمال تغطية مجموعة قيم التبديل () المحتملة . بعبارة أخرى ، إذا كنت تستخدم التعداد:

    public enum  Car {
        NIVA, NEXIA, KIA
    }

    ثم إذا قمت بكتابة switch () على النحو التالي ، فإن المترجم سيرمي خطأ يقول أنه لم يتم سرد جميع الحالات المحتملة من التعداد:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • القدرة على إرجاع قيمة:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };


نمط مطابقة


مطابقة الأنماط هي ميزة معاينة جديدة متاحة في Java 14. كان هناك الكثير من الحديث عنها ، وكان الكثيرون ينتظرونها ، ومن هنا. الهدف هو دمج فحص نوع الكائن وتحويله في مثيل عامل التشغيل . بعبارة أخرى ، قبل Java 14 نكتب هكذا:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

أولئك. من أجل استخدام أساليب الفئة التي يكون الكائن ، تحتاج إلى إرسالها إلى هذه الفئة. بدءًا من Java 14 ، يتوفر بناء جديد يجمع فيه مثيل من وظائف التحقق والتحويل:

Object obj = "Igor";

if (obj instanceof String s){
    System.out.println(s.length());
}

استنتاج


تستمر جافا في التطور ، مما يجعل الحياة أسهل لمطوري البشر العاديين. تم تصميم الميزات الجديدة لجعل الشفرة أكثر نظافة وحياة أسهل ورواتب أعلى. ما رأيك ، ما هي الميزات الجديدة التي ستكسب حب المجتمع؟

All Articles