ميزات Java 12

أخيرًا، JDK 12 الذي هو جزء من دورة الإصدار كل ستة أشهر، هنا. يأتي بعد آخر إصدار LTS لـ Java 11. كنا قد ناقشنا بتفصيل ميزات Java 11 من قبل. اليوم سنناقش ميزات Java 12 ونرى ما الذي يحمله للمطورين. تم إطلاق Java 12 في 19 مارس 2019. إنه إصدار غير LTS. لذلك لن يكون لديه الدعم على المدى الطويل.

ميزات Java 12

بعض ميزات Java 12 المهمة؛

  1. تغييرات في JVM – JEP 189، JEP 346، JEP 344، وJEP 230.
  2. تعبيرات البديل
  3. طريقة mismatch() للملف
  4. تنسيق الأرقام المضغوطة
  5. جامعي Teeing في واجهة برمجة التطبيقات Stream
  6. طرق جديدة للسلاسل في Java – indent()، transform()، describeConstable()، و resolveConstantDesc().
  7. JEP 334: واجهة برمجة التطبيقات Constants في JVM
  8. JEP 305: Pattern Matching لـ instanceof
  9. السلاسل النصية الخام تمت إزالتها من JDK 12.

لنلق نظرة على كل هذه الميزات في Java 12 واحدة تلو الأخرى.

تغييرات في JVM

1. JEP 189 – Shenandoah: مجمع القمامة بأقل وقت توقف (تجريبي)

قامت RedHat ببدء مشروع مجمع القمامة Shenandoah لتقليل أوقات توقف جمع القمامة. الفكرة هي تشغيل جمع القمامة بشكل متزامن مع خيوط Java الجارية. الهدف هو تحقيق توقف قصير متسق وقابل للتنبؤ بشكل غير مهم بغض النظر عن حجم الذاكرة الخردة. لذا لا يهم ما إذا كان حجم الذاكرة الخردة 15 ميغابايت أو 15 جيجابايت. إنه ميزة تجريبية في Java 12.

2. JEP 346 – إرجاع الذاكرة المخصصة غير المستخدمة بسرعة من G1

ابتداءً من Java 12، ستقوم G1 الآن بفحص ذاكرة الأطر الرئيسية لـ Java أثناء عدم نشاط التطبيق وإعادتها إلى نظام التشغيل. هذا إجراء وقائي للحفاظ على الذاكرة الحرة واستخدامها.

3. JEP 344: مجموعات جمع مختلطة قابلة للإلغاء لـ G1

تتضمن تحسينات في كفاءة G1 جعل جمعيات G1 المختلطة قابلة للإلغاء إذا كان من الممكن أن تتجاوز الهدف المحدد للتوقف. يتم ذلك عن طريق تقسيم مجموعة الجمع المختلطة إلى إلزامية واختيارية. بالتالي يمكن لجامع G1 أن يعطي الأولوية لجمع المجموعة الإلزامية أولاً لتحقيق هدف وقت التوقف.

4. JEP 230 and 344

Microbenchmark Suite, JEP 230 يضيف ميزة مجموعة أساسية من اختبارات الأداء الصغيرة إلى شيفرة المصدر JDK. وهذا يجعل من السهل على المطورين تشغيل اختبارات الأداء الصغيرة الحالية وإنشاء اختبارات جديدة. One AArch64 Port, Not Two, JEP 344, يقوم بإزالة جميع المصادر المتعلقة بمنفذ arm64 مع الاحتفاظ بمنفذ ARM de 32 بت ومنفذ aarch64 de 64 بت. وهذا يسمح للمساهمين بتركيز جهودهم على تنفيذ واحد لـ ARM de 64 بت

5. JEP 341 Default CDS Archives

يعزز هذا عملية بناء JDK لتوليد أرشيف مشاركة البيانات الفئوية (CDS) باستخدام قائمة الفئات الافتراضية على منصات 64 بت. الهدف هو تحسين وقت بدء التشغيل. اعتبارًا من Java 12 ، يكون CDS مُفعلًا افتراضيًا. لتشغيل برنامجك دون تفعيل CDS ، اتبع الخطوات التالية:

java -Xshare:off HelloWorld.java

الآن، سيؤدي ذلك إلى تأخير وقت بدء تشغيل البرنامج.

تغييرات اللغة والميزات

لقد قدمت Java 12 العديد من ميزات اللغة. دعونا نلقي نظرة على بعضها مع التنفيذات.

1. تعابير التبديل (معاينة)

قامت Java 12 بتعزيز تعابير التبديل لمطابقة النمط. تم تقديمها في JEP 325، كميزة لغة معاينة، الصيغة الجديدة هي L ->. فيما يلي بعض الأشياء المهمة حول تعابير التبديل:

  • الصيغة الجديدة تزيل الحاجة إلى عبارة الكسر لمنع الانزلاقات.
  • تعابير التبديل لم تعد تنزلق بعد الآن.
  • علاوة على ذلك، يمكننا تعريف عدة ثوابت في نفس التسمية.
  • حالة default مطلوبة الآن في تعابير التبديل.
  • يتم استخدام break في تعابير التبديل لإرجاع القيم من الحالة نفسها.

بيان التبديل الكلاسيكي:

String result = "";
        switch (day) {
            case "M":
            case "W":
            case "F": {
                result = "MWF";
                break;
            }
            case "T":
            case "TH":
            case "S": {
                result = "TTS";
                break;
            }
        };

        System.out.println("Old Switch Result:");
        System.out.println(result);

مع تعبير التبديل الجديد، لم نعد بحاجة إلى تعيين break في كل مكان وبالتالي منع أخطاء المنطق!

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

        };

        System.out.println(result);

لنقم بتشغيل البرنامج أدناه الذي يحتوي على تعبير التبديل الجديد باستخدام JDK 12.

public class SwitchExpressions {

    public static void main(String[] args)
    {
        System.out.println("New Switch Expression result:");
        executeNewSwitchExpression("M");
        executeNewSwitchExpression("TH");
        executeNewSwitchExpression("");
        executeNewSwitchExpression("SUN");
    }

    public static void executeNewSwitchExpression(String day){

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

        };

        System.out.println(result);
    }
}

نظرًا لأن هذه ميزة معاينة، يرجى التأكد من اختيار مستوى اللغة كـ Java 12 معاينة. لتجميع الشيفرة أعلاه، قم بتشغيل الأمر التالي:

javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java

بعد تشغيل البرنامج المجمع، نحصل على ما يلي في وحدة التحكم:

Java Switch Expressions Program Output

تُعتبر تعابير التبديل ميزة لغوية معاينة. وهذا يعني أنه حتى لو كانت كاملة، فقد لا تكون مؤكدة في إصدار Java المستقبلي.

2. طريقة File.mismatch

أضاف Java 12 الطريقة التالية لمقارنة ملفين:

public static long mismatch(Path path, Path path2) throws IOException

تُعيد هذه الطريقة موضع أول عدم تطابق أو -1L إذا لم يكن هناك عدم تطابق. يمكن أن يحدث عدم تطابق بين ملفين في الحالات التالية:

  • إذا كانت البايتات غير متطابقة. في هذه الحالة، يتم إرجاع موضع أول بايت غير متطابق.
  • إذا كانت أحجام الملفات غير متطابقة. في هذه الحالة، يتم إرجاع حجم الملف الأصغر.

يُعطى قطعة من الشيفرة المثالية من IntelliJ Idea أدناه:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileMismatchExample {

    public static void main(String[] args) throws IOException {
        Path filePath1 = Files.createTempFile("file1", ".txt");
        Path filePath2 = Files.createTempFile("file2", ".txt");
        Files.writeString(filePath1,"JournalDev Test String");
        Files.writeString(filePath2,"JournalDev Test String");

        long mismatch = Files.mismatch(filePath1, filePath2);

        System.out.println("File Mismatch position... It returns -1 if there is no mismatch");

        System.out.println("Mismatch position in file1 and file2 is >>>>");
        System.out.println(mismatch);

        filePath1.toFile().deleteOnExit();
        filePath2.toFile().deleteOnExit();

        System.out.println();

        Path filePath3 = Files.createTempFile("file3", ".txt");
        Path filePath4 = Files.createTempFile("file4", ".txt");
        Files.writeString(filePath3,"JournalDev Test String");
        Files.writeString(filePath4,"JournalDev.com Test String");

        long mismatch2 = Files.mismatch(filePath3, filePath4);

        System.out.println("Mismatch position in file3 and file4 is >>>>");
        System.out.println(mismatch2);

        filePath3.toFile().deleteOnExit();
        filePath4.toFile().deleteOnExit();



    }

}

الإخراج عند تجميع وتشغيل برنامج Java أعلاه هو:

Java File Mismatch Example Program Output

3. تنسيق الأرقام المضغوطة

import java.text.NumberFormat;
import java.util.Locale;

public class CompactNumberFormatting {


    public static void main(String[] args)
    {
        System.out.println("Compact Formatting is:");
        NumberFormat upvotes = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
        upvotes.setMaximumFractionDigits(1);

        System.out.println(upvotes.format(2592) + " upvotes");


        NumberFormat upvotes2 = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
        upvotes2.setMaximumFractionDigits(2);
        System.out.println(upvotes2.format(2011) + " upvotes");
    }


}
Java Compact Number Formatting Program Output

4. جمع الجماعات

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

double mean = Stream.of(1, 2, 3, 4, 5)
                .collect(Collectors.teeing(
                        summingDouble(i -> i),
                        counting(),
                        (sum, n) -> sum / n));

System.out.println(mean);

الناتج هو 3.0.

5. طرق جديدة للسلاسل في جافا

تم تقديم 4 طرق جديدة في جافا 12 وهي:

  • indent(int n)
  • transform(Function f)
  • Optional describeConstable()
  • String resolveConstantDesc​(MethodHandles.Lookup lookup)

لمعرفة المزيد حول الطرق المذكورة أعلاه وتنفيذها بالتفصيل، راجع دورتنا التعليمية حول طرق سلسلة جافا 12.

6. JEP 334: واجهة برمجة ثوابت الآلة الظاهرية

A new package java.lang.constant is introduced with this JEP. This is not that useful for those developers who don’t use constants pool.

7. JEP 305: Pattern Matching لـ instanceof (معاينة)

ميزة لغة أخرى للمعاينة! الطريقة القديمة لتحويل نوع إلى نوع آخر هي:

if (obj instanceof String) {
    String s = (String) obj;
     // استخدم s في الكود الخاص بك من هنا 
}

الطريقة الجديدة هي:

if (obj instanceof String s) {
     // يمكن استخدام s مباشرة هنا 
} 

هذا يوفر لنا بعض عمليات التحويل التي كانت غير ضرورية.

تمت إزالة السلاسل النصية الخام من JDK 12.

هذا يضع نهاية لهذا المقال عن ميزات Java 12.

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