ميزات جافا 14

تماشياً مع التقليد الدوري كل ستة أشهر، بعد إصدار جافا 13 في 17 سبتمبر 2019، من المقرر إصدار جافا 14، وهو إصدار غير LTS آخر، في 17 مارس 2020.

ميزات جافا 14

إليك قائمة بميزات جافا 14:

  • تعبيرات الانتقال (القياسي) – JEP 361
  • مطابقة الأنماط لـinstanceof (معاينة) – JEP 305
  • تعامل أفضل مع استثناءات القيمة الفارغة – JEP 358
  • سجلات (معاينة) – JEP 359
  • كتل النص (معاينة ثانية) – JEP 368
  • أداة التعبئة (حضانة) – JEP 343
  • تخصيص الذاكرة متعددة الوصول NUMA لـ G1 – JEP 345
  • بث الأحداث JFR – JEP 349
  • مخازن البيانات المتجانسة غير القابلة للتطاير – JEP 352
  • ZGC على macOS – JEP 364
  • ZGC على Windows – JEP 365
  • واجهة برمجة تطبيقات الوصول إلى الذاكرة الخارجية (حضانة) – JEP 370

إعداد تثبيت جافا 14 على نظام Mac OS

  • للبدء في Java 14، قم بتنزيل JDK من هنا.
  • انسخ وفك الضغط عن ملف tar في /Library/Java/JavaVirtualMachines كما هو موضح أدناه:
$ cd /Library/Java/JavaVirtualMachines

$ sudo cp ~/Downloads/openjdk-14_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines

$ sudo tar xzf openjdk-14_osx-x64_bin.tar.gz

$ sudo rm openjdk-14_osx-x64_bin.tar.gz

بمجرد الانتهاء من ذلك، افتح bash_profile باستخدام أي محرر نصوص. أنا استخدم vim ~/.bash_profile. قم بتعيين مسار Java14 إلى JAVA_HOME، واحفظ التغييرات وقم بتنفيذ source ~/.bash_profile لعكس التغييرات.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home

وأخيرًا، أنت الآن جاهز لتجميع وتشغيل البرامج باستخدام Java 14. سنستخدم JShell، أداة سطر الأوامر التفاعلية REPL لاختبار ميزات Java 14 الجديدة بسرعة.

من المهم أن نلاحظ أن العديد من الميزات التي تم إصدارها في Java 14 هي في مرحلة العرض. هذا يعني أنه على الرغم من أنها تعمل بشكل كامل الآن، قد يتم تعديل الأمور في المستقبل. قد يتم تحويل بعضها إلى ميزات قياسية أو إزالتها ببساطة في دورات الإصدار القادمة. لاختبار ميزات العرض، يجب عليك ضبط --enable-preview بشكل صريح عند تشغيل JShell أو البرنامج Java كما هو موضح أدناه:

jshell --enable-preview

javac --release 14 --enable-preview Author.java

في الأقسام القليلة القادمة، دعنا نناقش بعض ميزات اللغة وJVM.

قراءة موصى بها: تثبيت Java 14 على Linux

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

تبعًا لبقاء تعبيرات القاطعة ميزة معاينة في الإصدارين الأخيرين – Java 12 و Java 13 – حصلت أخيرًا على وضع دائم في Java 14.

  • Java 12 قدمت بنية اللامبدا لتعبيرات القاطعة، مما يسمح بعدة علامات حالة لمطابقة النمط، وكذلك منع التداخلات التي تؤدي إلى كود طويل. كما فرضت حالات شاملة حيث سيتم رمي خطأ في الترجمة إذا لم يتم تغطية جميع حالات الإدخال.
  • Java 13، المعاينة الثانية، قدمت بيانات yield بدلاً من break لإرجاع القيم من التعبير.

Java 14 قد جعلت أخيرًا هذه الميزات معيارًا الآن.

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    yield "Please insert a valid day.";
                else
                    yield "Looks like a Sunday.";
            }

        };
System.out.println(result);
Java 14 Switch Expressions

ملحوظة: ليس yield كلمة مفتاحية جديدة في Java. إنها مجرد استخدام في تعبيرات القاطعة.

2. تطابق الأنماط مع instanceof (معاينة)

اسأل أي مطور Java ليظهر قاعدة الشيفرة الخاصة به، وستجد استخدامًا جيدًا لشروط instanceof في جميع أنحاء الشيفرة. وبشكل خاص، يتبع فحص الشرط instanceof عادةً عملية تحويل النوع.

Java 14، تتخلص من هذا التفرد من خلال جعل استخراج الشرط أكثر اختصارًا بكثير.

قبل Java 14:

if (obj instanceof Journaldev) {
  Journaldev jd = (Journaldev) obj;
  System.out.println(jd.getAuthor());
}

Java 14 فأعلى:

if (obj instanceof Journaldev jd) {
  System.out.println(jd.getAuthor());
}

في الكود أعلاه، ستتم مهمة تعيين النسخة jd فقط إذا كان obj من نوع Journaldev. نطاق المتغير محدود إلى الكتلة الشرطية فقط.

3. الاستثناءات الفارغة المفيدة

استثناءات النقطة الفارغة الخالية هي كابوس لأي مطور. في السابق، وحتى Java 13، كان من الصعب تصحيح الاستثناءات الشهيرة NPEs. كان على المطورين اللجوء إلى أدوات تصحيح أخرى أو تحديد المتغير/الطريقة التي كانت فارغة يدويًا نظرًا لأن الإشارة الطرفية كانت تظهر فقط رقم السطر.

قبل Java 14:

String name = jd.getBlog().getAuthor()

// إشارة طرفية
Exception in thread "main" java.lang.NullPointerException
    at NullPointerExample.main(NullPointerExample.java:5)

قامت Java 14 بتقديم ميزة جديدة في JVM تقدم رؤى أفضل مع إشارة طرفية أكثر وصفًا كما هو موضح أدناه:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Journaldev.getBlog()" is null
    at NullPointerExample.main(NullPointerExample.java:4)

ملاحظة: الخاصية أعلاه ليست ميزة لغوية. إنها تحسين في بيئة التشغيل.

4. السجلات (معاينة)

A record is a data class that stores pure data. The idea behind introducing records is to quickly create simple and concise classes devoid of boilerplate code.

عادةً ما يتطلب الفصل في Java منك تنفيذ equals()، hashCode()، وطرق الحصول والتعيين. بينما تدعم بعض بيئات التطوير التكاملية إنشاء تلك الفصول تلقائيًا، إلا أن الكود لا يزال طويلًا. مع record، تحتاج فقط إلى تحديد فئة بالطريقة التالية.

record Author(){}
//أو
record Author (String name, String topic) {}

سوف يقوم مترجم Java بإنشاء مُنشئ، حقول نهائية خاصة، ووصولات، وأساليب equals/hashCode و toString تلقائيًا. طرق الحصول المُولَّدة تلقائيًا للصنف المذكور أعلاه هي name() و topic().

للاطلاع على الشيفرة المُولَّدة، استخدم javap Author بعد تجميع البرنامج باستخدام javac. تُظهر الرسم التوضيحي التالي الصنف المُولَّد لـ record Author (String name, String topic) {}:

Javap Records Java 14

دلالة السجلات مُشابهة لفئات البيانات في Kotlin

بالإضافة إلى ذلك، يمكننا إضافة حقول إضافية وطرق ومُنشئ للسجل بالطريقة التالية:

record Author (int id, String name, String topic) {
    static int followers;

    public static String followerCount() {
        return "Followers are "+ followers;
    }

    public String description(){
        return "Author "+ name + " writes on "+ topic;
    }

    public Author{
    if (id < 0) {
        throw new IllegalArgumentException( "id must be greater than 0.");
     }
   }
}

المُنشئ الإضافي المحدد داخل السجل يُسمى مُنشئ مُكتَظ. لا يتألف من أي معلمات وهو مجرد تمديد للمُنشئ الكنسي

A compact constructor wouldn’t be generated as a separate constructor by the compiler. Instead, it is used for validation cases and would be invoked at the start of the main constructor.

بعض الأشياء المهمة للملاحظة حول السجلات:

  • A record can neither extend a class nor it can be extended by another class. It’s a final class.
  • السجلات لا يمكن أن تكون مجردة
  • السجلات لا يمكن أن تمتد إلى أي فئة أخرى ولا يمكن أن تحدد حقول النسخة داخل الهيكل. يجب تعريف حقول النسخة في وصف الحالة فقط
  • الحقول المعلنة خاصة ونهائية
  • يسمح هيكل السجل بالحقول والطرق الثابتة

قراءة مُوصى بها: سجلات Java

4.1) يمكن تحويل قيم داخل حقول الإشارة في سجل

من المهم أن نلاحظ أنه بالنسبة للحقول المعرفة ككائنات، يكون الإشارة فقط غير قابلة للتغيير. يمكن تعديل القيم الأساسية. يظهر الرسم التوضيحي التالي سجلًا تم تعديل ArrayList فيه. كما يمكن رؤية تعديل القيمة في كل مرة يتم فيها تغيير ArrayList.

Java 14 Records Mutable Values For References

4.2) يمكن للسجلات تنفيذ واجهات

يوضح الكود التالي مثالًا على تنفيذ واجهة باستخدام السجلات:

record Author(String name, String topic) implements Information {
  public String getFullName() {
    return "Author "+ name + " writes on " + topic;
  }
}

interface Information {
  String getFullName();
}

إليك نتيجة الشيفرة أعلاه في JShell:

Java 14 Records With Interface

4.3) تدعم السجلات العديد من البناة

تسمح السجلات بتعريف العديد من البناة بوجود أو بدون معلمات كما هو موضح أدناه:

record Author(String name, String topic) {
  public Author() {

    this("NA", "NA");
  }

  public Author(String name) {

    this(name, "NA");
  }
}

4.4) تسمح السجلات بتعديل أساليب الوصول

على الرغم من أن السجلات تولد أساليب الوصول العامة للحقول المعرفة في وصف الحالة، إلا أنها تسمح أيضًا لك بإعادة تعريف أساليب الوصول في الجسم كما هو موضح أدناه:

record Author(String name, String topic) {
  public String name() {
        return "This article was written by " + this.name;
    }
}

4.5) التحقق من السجل ومكوناته أثناء التشغيل

توفر السجلات لنا isRecord() و getRecordComponents() للتحقق مما إذا كانت الفئة سجلاً وأيضًا النظر في حقولها وأنواعها. توضح الرسم التوضيحي التالي كيف يتم ذلك:

Java 14 Records Runtime Check

بينما قمنا بإضافة حقول وأساليب إضافية إلى السجل في أمثلة الكود أعلاه، تأكد من عدم الإفراط في ذلك. تم تصميم السجلات كحاملات بيانات عادية وإذا كنت تبحث عن تنفيذ الكثير من الأساليب الإضافية، من الأفضل اللجوء إلى الفئة العادية.

5. كتل النص (معاينة)

تم تقديم كتل النص كميزة معاينة في جافا 13 بهدف السماح بإنشاء سلاسل نصية متعددة الأسطر بسهولة. إنه مفيد في إنشاء سلاسل HTML و JSON أو استعلامات SQL بسهولة.

في جافا 14 ، لا تزال كتل النص في مرحلة معاينة مع بعض الإضافات الجديدة. يمكننا الآن استخدام:

  • علامة الشرطة العكسية لعرض كتل النص المتعددة الأسطر بشكل جميل.
  • يتم استخدام \s للنظر في الفراغات المتبقية التي تتم تجاهلها بشكل افتراضي من قبل المترجم. يحفظ جميع الفراغات الموجودة قبله.
String text = """
                Did you know \
                Java 14 \
                has the most features among\
                all non-LTS versions so far\
                """;

String text2 = """
                line1
                line2 \s
                line3
                """;


String text3 = "line1\nline2 \nline3\n"

// النص 2 والنص 3 متساويان.

المراجع: OpenJDK 14

Source:
https://www.digitalocean.com/community/tutorials/java-14-features