ميزات Java 11

لم نغمر أنفسنا تمامًا في جافا 10 بعد، وجافا 11 هنا الآن. جافا 11 مهمة لأسباب أكثر من بضعة. قامت أوراكل بإعادة هيكلة نموذج الدعم الخاص بها وأتت بقطار الإصدارات الذي سيجلب تحديثات سريعة، تقريبًا كل 6 أشهر. لقد قاموا بتغيير نموذج الترخيص والدعم مما يعني أنه إذا قمت بتنزيل جافا 11 من أوراكل JDK، سيتعين عليك دفع ثمنها للاستخدام التجاري.

هل هذا يعني أنه يجب علي دفع مقابل استخدام جافا من الآن فصاعدًا؟ لا. ليس بالضرورة ما لم تقم بتنزيل أوراكل JDK واستخدامه في الإنتاج.

ملاحظة: إن إصدار مجتمع IntelliJ IDEA 2018.2.4 يدعم بالفعل جافا 11.

1. لماذا تعتبر جافا 11 مهمة؟

جافا 11 هي الإصدار الثاني طويل الأمد بعد جافا 8. منذ جافا 11، لن يكون JDK من أوراكل مجانيًا للاستخدام التجاري بعد الآن. يمكنك استخدامه في مراحل التطوير ولكن لاستخدامه تجاريًا، عليك شراء ترخيص. إذا لم تقم بذلك، يمكن أن تحصل على فاتورة من أوراكل في أي يوم! جافا 10 كانت آخر JDK مجانية يمكن تنزيلها من أوراكل. أوراكل توقف الدعم لجافا 8 اعتبارًا من يناير 2019. عليك دفع مقابل دعم إضافي. يمكنك الاستمرار في استخدامه، لكنك لن تحصل على أي تحديثات أمان أو إصلاحات.

لن تقدم أوراكل الدعم الطويل الأمد (LTS) مجانًا لأي إصدار من جافا بعد جافا 11.

بينما لم يعد Oracle JDK مجانيًا، يمكنك دائمًا تنزيل إصدارات Open JDK من Oracle أو مزودين آخرين مثل AdoptOpenJDK، Azul، IBM، Red Hat، إلخ. في رأيي، ما لم تكن تبحث عن استخدام على مستوى المؤسسة مع الرغبة في دفع رسوم الدعم، يمكنك استخدام OpenJDK وترقيتها حسب الحاجة.

2. أي تنزيل لبنية JDK يجب علي تنزيلها وما هي فوائد كل واحدة منها؟

نظرًا لأن Oracle قامت بإنشاء قطار إصدارات يتم إطلاق نسخة جديدة كل ستة أشهر، إذا كنت تستخدم Open JDK المجاني من Oracle، فستحتاج إلى تحديثه كل ستة أشهر، حيث لن تقدم Oracle التحديثات المجانية بمجرد إصدار النسخة الجديدة. يمكن أن يكون هذا أمرًا صعبًا للتكيف في الشركة. ادفع مقابل الدعم التجاري إلى Oracle وانتقل فقط من إصدار LTS واحد إلى الإصدار LTS التالي. بهذه الطريقة، ستحصل على جميع التحديثات والدعم لـ Java 11 حتى عام 2026. يمكنك تنزيل Java 17 في عام 2022. استمر في استخدام الإصدار المجاني من Java حتى بعد انتهاء دعمه. على الرغم من أنك لن تحصل على تحديثات الأمان وقد يفتح ذلك ثغرات أمنية.

Oracle لن تقدم الدعم التجاري أو التحديثات لـ Java 9 و Java 10. عليك البحث عن بناء بديل آخر من أجل الاستمرار في استخدامها مجانًا.

بعد فهم الأعباء التي يأتي بها Java 11، دعونا الآن نحلل الميزات الهامة في Java 11 للمطورين. سنناقش بعض JEPs الهامة أيضًا. ملاحظة: سيتوفر JavaFX كوحدة منفصلة ولن يرتبط بجدول إصدارات JDK لـ Java كل 6 أشهر.

3. كيفية تنزيل النسخة المجانية من Java 11؟

يمكنك تنزيل إصدار OpenJDK الجاهز للإنتاج من هذا الرابط. الثنائيات متوفرة في تنسيقات tar أو zip، فقط قم بفك الضغط عليها وضبط المتغيرات البيئية لاستخدام مترجم جافا وأوامر جافا.

4. ميزات Java 11

بعض الميزات الهامة في Java 11 هي:

  • تشغيل ملف Java بأمر واحد
  • طرق جديدة للمرافقة في فئة السلسلة
  • بنية الأمان القائمة على التضمين
  • ترميز المتغيرات المحلية لمعلمات اللامبدا
  • JEP 321: عميل HTTP
  • قراءة/كتابة السلاسل إلى ومن الملفات
  • JEP 328: مسجل الرحلة

لنناقش الميزات الجديدة المُقدمة مع Java 11 من خلال عملية JEP.

4.1) تشغيل ملف جافا بأمر واحد

التغيير الرئيسي هو أنه لا يلزمك تجميع ملف المصدر جافا باستخدام أداة javac أولاً. يمكنك تشغيل الملف مباشرةً باستخدام الأمر java ويتم الترجمة ضمنيًا. يأتي هذا الميزة ضمن JEP 330. فيما يلي نظرة سريعة على الأساليب الجديدة في فئة Java String المُقدمة في Java 11:

4.2) أساليب سلسلة جافا

isBlank() – تُرجع هذه الطريقة الفرعية قيمة بوليانية. يُعامل السلاسل الفارغة والسلاسل التي تحتوي فقط على مسافات بيضاء على أنها فارغة.

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // الكود هنا!
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() تُرجع هذه الطريقة تيارًا من السلاسل، وهو مجموعة من جميع الأجزاء الفرعية المقسمة بواسطة الأسطر.

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

إخراج الكود أعلاه هو: strip()، stripLeading()، stripTrailing() strip() – يزيل المسافات البيضاء من البداية والنهاية للسلسلة.

لدينا بالفعل trim(). ثم ما الحاجة إلى strip()؟ strip() هو “تطور مدرك ليونيكود” لـ trim(). عندما تم تقديم trim()، لم يكن يونيكود قد تطور بعد. الآن، يقوم strip() الجديد بإزالة جميع أنواع الفراغات البادئة والمتبقية (تحقق من الطريقة Character.isWhitespace(c) لمعرفة ما إذا كان يونيكود فراغًا أم لا)

مثال يستخدم الطرق الثلاثة أعلاه مدرج أدناه:

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

المخرجات في وحدة التحكم من الكود أعلاه هي: repeat(int) تكرار الطريقة ببساطة يكرر السلسلة تلك العدد من المرات كما هو مذكور في الطريقة في شكل عدد صحيح.

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) البنية النحوية المحلية لمعلمات لامبدا

JEP 323، الجملة المحلية لبنية بيانات التعبيرات اللامبدا هو الإصدار الوحيد لميزة اللغة في جافا 11. في جافا 10، تم إدخال استنتاج نوع المتغير المحلي. وبالتالي يمكننا استنتاج نوع المتغير من RHS – var list = new ArrayList<String>(); JEP 323 يسمح باستخدام var لتعريف المعلمات الشكلية لتعبير لامبدا ذي النوع الضمني. يمكننا الآن تحديد:

(var s1, var s2) -> s1 + s2

كان هذا ممكنًا في جافا 8 أيضًا ولكن تمت إزالته في جافا 10. الآن عاد في جافا 11 للحفاظ على التجانس. ولكن لماذا يلزم ذلك عندما يمكننا تجاوز النوع في اللامبدا؟ إذا كنت بحاجة إلى تطبيق تعليق مثل @Nullable، لا يمكنك القيام بذلك دون تحديد النوع. قيد هذه الميزة – يجب عليك تحديد نوع var على جميع المعلمات أو لا شيء. الأشياء مثل ما يلي غير ممكنة:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) التحكم في الوصول على أساس التضمين

قبل جافا 11 كان ذلك ممكنًا:

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

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

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

تتعامل مراقبة الوصول المتداخلة في جافا 11 مع هذا الاهتمام في الانعكاس. يُدخل java.lang.Class ثلاثة أساليب جديدة في واجهة برمجة التطبيقات للانعكاس: getNestHost()، getNestMembers()، و isNestmateOf().

4.5) JEP 309: الثوابت الحديثة لملفات الفئات الديناميكية

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

4.6) JEP 318: إيبسيلون: جامع القمامة الذي لا يقوم بأي عمليات

على عكس جامع القمامة في الآلة الظاهرية لجافا الذي يتولى تخصيص الذاكرة وإطلاقها، إيبسيلون يقوم فقط بتخصيص الذاكرة. يقوم بتخصيص الذاكرة للأشياء التالية:

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

الآن يعتبر Elipson جيدًا فقط لبيئات الاختبار. سيؤدي إلى OutOfMemoryError في الإنتاج وتعطيل التطبيقات. فائدة Elipson هي عدم وجود فوقية تطهير الذاكرة. وبالتالي سيوفر نتيجة اختبار دقيقة للأداء ولن نتمكن من إيقاف جمع القمامة لإيقافه. ملاحظة: هذه ميزة تجريبية.

4.7) JEP 320: إزالة وحدات Java EE و CORBA

كانت الوحدات متقاعدة بالفعل في Java 9. تم إزالتها تمامًا الآن. تمت إزالة الحزم التالية: java.xml.ws، java.xml.bind، java.activation، java.xml.ws.annotation، java.corba، java.transaction، java.se.ee، jdk.xml.ws، jdk.xml.bind

4.8) JEP 328: مسجل الرحلة

سجل الرحلة الذي كان في السابق يُستخدم كإضافة تجارية في Oracle JDK مفتوح المصدر الآن، بما أن Oracle JDK نفسها لم تعد مجانية بعد الآن. JFR هو أداة تحليل تُستخدم لجمع البيانات التشخيصية والتحليلية من تطبيق Java القائم. تكاليف أدائه ضئيلة للغاية وعادةً ما تكون أقل من 1٪. وبالتالي يمكن استخدامه في التطبيقات الإنتاجية.

4.9) JEP 321: HTTP Client

تقوم Java 11 بتوحيد واجهة مستخدم HTTP Client. تدعم الواجهة الجديدة كل من HTTP/1.1 و HTTP/2. تم تصميمها لتحسين الأداء العام لإرسال الطلبات من قبل العميل واستقبال الردود من الخادم. كما أنها تدعم بشكل أصلي WebSockets.

4.10) قراءة/كتابة السلاسل إلى ومن الملفات

تهدف Java 11 إلى جعل قراءة وكتابة السلاسل أكثر سهولة. لقد قدمت الطرق التالية للقراءة والكتابة من/إلى الملفات:

  • readString()
  • writeString()

الكود التالي يوضح مثالاً على ذلك

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: خوارزميات التشفير ChaCha20 و Poly1305

توفر Java 11 تنفيذات لتشفير ChaCha20 و ChaCha20-Poly1305. ستتم تنفيذ هذه الخوارزميات في موفر SunJCE.

4.12) JEP 315: تحسين الأداء لتعليمات Aarch64

تحسين تعليمات السلاسل والمصفوفات الموجودة، وتنفيذ تعليمات جديدة لوظائف sin، cos، و log في java.lang.Math، على معالجات AArch64.

4.13) JEP 333: ZGC: جامع المخلفات ذو القليل من التأخير وقابل للتوسع (تجريبي)

قامت Java 11 بإدخال جامع للمخلفات منخفض التأخير. هذه ميزة تجريبية. من الجيد رؤية أن أوراكل تولي أهمية لجامع المخلفات.

4.14) JEP 335: إهانة محرك Nashorn JavaScript

يتم إهانة محرك Nashorn JavaScript وواجهات برمجة التطبيقات المرتبطة به، مما يشير إلى أنه سيتم إزالتها في الإصدارات اللاحقة.

5. الختام

لقد قمنا بمراجعة الميزات والتحديثات الهامة المقدمة في Java 11. أراك قريبًا عند إصدار Java 12.

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