ميزات جافا 9 مع أمثلة

Java 9 هو إصدار رئيسي وقد جلب لنا الكثير من الميزات للمطورين. في هذه المقالة، سننظر في ميزات Java 9 بتفصيل.

تم إصدار Java 10، للحصول على نظرة شاملة عن إصدار Java 10، تفضل بقراءة ميزات Java 10.

ميزات Java 9

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

  1. Java 9 REPL (JShell)
  2. طرق مصنعية لقائمة غير قابلة للتغيير، مجموعة، خريطة، و Map.Entry
  3. الطرق الخاصة في الواجهات
  4. نظام الوحدات في Java 9
  5. تحسينات واجهة برمجة التطبيقات للعمليات
  6. تحسينات مع جملة Try With Resources
  7. تحسينات واجهة CompletableFuture
  8. تيارات رد الفعل
  9. المشغل الماسي للفئة الداخلية المجهولة
  10. تحسينات في فئة Optional
  11. تحسينات واجهة برمجة التيارات
  12. تحسين التعليق @Deprecated
  13. عميل HTTP 2
  14. واجهة برمجة تطبيق الصور متعددة الدقة
  15. ميزات Java 9 المتنوعة

ستقوم Oracle Corporation بإصدار Java SE 9 حوالي نهاية مارس 2017. في هذا المنشور، سأناقش “ميزات Java 9” بإيجاز مع بعض الأمثلة.

Java 9 REPL (JShell)

قامت Oracle Corp بتقديم أداة جديدة تسمى “jshell”. تعني جافا شيل ومعروفة أيضًا باسم REPL (Read Evaluate Print Loop). يتم استخدامها لتنفيذ واختبار أي بناء جافا مثل الفئة، والواجهة، والتعداد، والكائن، والبيانات الخ. بسهولة شديدة. يمكننا تنزيل برنامج JDK 9 EA (Early Access) من https://jdk9.java.net/download/

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

إذا كنت ترغب في معرفة المزيد عن أداة REPL، يرجى الاطلاع على أساسيات Java 9 REPL (الجزء 1) و ميزات Java 9 REPL (الجزء 2).

طرق المصنع لقائمة، مجموعة، خريطة و Map.Entry لا يمكن تغييرها

قامت شركة Oracle Corp بتقديم بعض طرق المصنع المريحة لإنشاء كائنات القوائم الغير قابلة للتغيير، والمجموعات، والخرائط وكائنات Map.Entry. تستخدم هذه الطرق المساعدة لإنشاء كائنات مجموعة فارغة أو غير فارغة. في Java SE 8 والإصدارات الأقدم، يمكننا استخدام طرق فئة Collections المساعدة مثل unmodifiableXXX لإنشاء كائنات مجموعة لا يمكن تغييرها. على سبيل المثال، إذا أردنا إنشاء قائمة غير قابلة للتغيير، فيمكننا استخدام طريقة Collections.unmodifiableList. ومع ذلك، فإن هذه الطرق Collections.unmodifiableXXX هي طريقة مملة وطويلة. للتغلب على هذه العيوب، قامت شركة Oracle Corp بإضافة عدد قليل من طرق المساعدة إلى واجهات List، Set، و Map. واجهات List و Set لديها طرق “of()” لإنشاء قائمة غير قابلة للتغيير أو غير فارغة كما هو موضح أدناه: مثال على قائمة فارغة

List immutableList = List.of();

مثال على قائمة غير فارغة

List immutableList = List.of("one","two","three");

الخريطة لديها مجموعتين من الطرق: طرق of() وطرق ofEntries() لإنشاء كائن خريطة غير قابل للتغيير وكائن Map.Entry غير قابل للتغيير على التوالي. مثال على خريطة فارغة

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

مثال على خريطة غير فارغة

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

إذا كنت ترغب في قراءة المزيد حول هذه الطرق المساعدة، يرجى الاطلاع على الروابط التالية:

الطرق الخاصة في الواجهات

في Java 8 ، يمكننا توفير تنفيذ الطريقة في الواجهات باستخدام الطرق الافتراضية والثابتة. ومع ذلك ، لا يمكننا إنشاء طرق خاصة في الواجهات. لتجنب تكرار الشفرة وزيادة إعادة الاستخدام ، تعتزم Oracle Corp إدخال طرق خاصة في واجهات Java SE 9. ابتداءً من Java SE 9 ، يمكننا كتابة الطرق الخاصة والثابتة الخاصة أيضًا في واجهة باستخدام كلمة “خاصة”. هذه الطرق الخاصة مثل الطرق الخاصة بالصف الآخر فقط ، لا يوجد فرق بينهما.

public interface Card{

  private Long createCardID(){
    // تنفيذ الطريقة تذهب هنا.
  }

  private static void displayCardDetails(){
    // تنفيذ الطريقة تذهب هنا.
  }

}

إذا كنت ترغب في قراءة المزيد حول هذه الميزة الجديدة ، يرجى الانتقال إلى هذا الرابط: Java 9 الطرق الخاصة في الواجهة.

نظام الوحدة في جافا 9

واحدة من التغييرات الكبيرة أو الميزات في جافا 9 هو نظام الوحدة. ستقوم Oracle Corp بتقديم الميزات التالية كجزء من مشروع جيغسو.

  • جي دي كي القابل للتحديد
  • الشفرة المصدرية لجافا القابلة للتحديد
  • الصور الزمنية القابلة للتشغيل القابلة للتحديد
  • تغليف واجهات برمجة التطبيقات الداخلية لجافا
  • نظام وحدة منصة جافا

قبل إصدارات جافا SE 9، كنا نستخدم الجرار الوحيد لتطوير التطبيقات القائمة على جافا. هذه الهندسة المعمارية لديها العديد من القيود والعيوب. لتجنب كل هذه النقاط السلبية، جافا SE 9 قادمة بنظام الوحدة. جي دي كي 9 قادمة بـ 92 وحدة (قد تتغير في الإصدار النهائي). يمكننا استخدام وحدات جي دي كي وأيضًا يمكننا إنشاء وحداتنا الخاصة كما هو موضح أدناه: مثال بسيط للوحدة

module com.foo.bar { }

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

تحسينات واجهة برمجة التطبيقات للعمليات

تأتي Java SE 9 ببعض التحسينات في واجهة برمجة التطبيقات للعمليات. لقد أضافوا فصلاً جديدًا وطرقًا جديدة لتسهيل التحكم في عمليات نظام التشغيل وإدارتها. فصلين جديدين في واجهة برمجة التطبيقات للعمليات:

مثال على واجهة برمجة التطبيقات

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());

تحسين في استخدام الموارد مع محاولة مع الموارد

نحن نعلم أن Java SE 7 قد قدمت بناء تحكم جديدًا في الاستثناءات: محاولة مع الموارد لإدارة الموارد تلقائيًا. الهدف الرئيسي لهذا البيان الجديد هو “إدارة الموارد التلقائية الأفضل”. ستقدم Java SE 9 بعض التحسينات على هذا البيان لتجنب بعض الإطناب الزائد وتحسين بعض قابلية القراءة. مثال على Java SE 7

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

مثال على Java 9

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

لقراءة المزيد حول هذه الميزة الجديدة، يرجى الاطلاع على البرنامج التعليمي الأصلي الخاص بي في: Java 9 Try-With-Resources Improvements

CompletableFuture API Improvements

في Java SE 9، ستقوم شركة Oracle بتحسين واجهة CompletableFuture API لحل بعض المشاكل التي ظهرت في Java SE 8. سيتم إضافة دعم لبعض التأخيرات والحدود الزمنية، وبعض الطرق المساعدة والتفوق في الفصائل الفرعية بشكل أفضل.

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

هنا delayedExecutor() هو طريقة مساعدة ثابتة تُستخدم لإرجاع Executor جديد يُقدم مهمة إلى المنفذ الافتراضي بعد التأخير المعطى.

Reactive Streams

في الوقت الحالي، أصبح البرمجة الردية شائعة جدًا في تطوير التطبيقات للاستفادة من بعض الفوائد الجميلة. إطارات مثل Scala و Play و Akka، إلخ، قامت بدمج Reactive Streams بالفعل وتحقق العديد من الفوائد. كما تقوم شركة Oracle بتقديم واجهة برمجة تطبيقات Reactive Streams الجديدة في Java SE 9. واجهة برمجة تطبيقات Reactive Streams في Java SE 9 هي إطار نشر/اشتراك لتنفيذ تطبيقات غير متزامنة وقابلة للتوسع والتوازي بسهولة باستخدام لغة Java. قد قدمت Java SE 9 الواجهة البرمجية التالية لتطوير تدفقات Reactive في تطبيقات تعتمد على Java.

  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor

اقرأ المزيد في Java 9 Reactive Streams.

مُشغِّل الماس للفئة الداخلية المجهولة

نحن نعلم، إن Java SE 7 قد قدمت ميزة جديدة: المشغِّل الماسي لتجنب الشفرة الزائدة والتكرار، لتحسين قراءة الشفرة. ومع ذلك، في Java SE 8، وجد فريق Oracle Corp (مطور مكتبة Java) بعض القيود في استخدام المشغِّل الماسي مع الفئة الداخلية المجهولة. لقد قاموا بحل تلك المشاكل وسيتم إصدارها كجزء من Java 9.

  public List getEmployee(String empid){
     // الشفرة للحصول على تفاصيل الموظف من مخزن البيانات
     return new List(emp){ };
  }

هنا نستخدم فقط “List” دون تحديد نوع المعلمة.

تحسينات في فئة Optional

في Java SE 9 ، قامت Oracle Corp بإضافة بعض الطرق الجديدة المفيدة إلى فئة java.util.Optional. هنا سأتحدث عن واحدة من تلك الطرق مع بعض الأمثلة البسيطة: طريقة stream. إذا كانت قيمة موجودة في كائن Optional المعطى ، فإن طريقة stream() تعيد تدفقًا تسلسليًا مع تلك القيمة. خلاف ذلك ، فإنها تعيد تدفقًا فارغًا. لقد أضافوا طريقة “stream()” للعمل على كائنات Optional بشكل كسول كما هو موضح أدناه:

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

هنا تُستخدم طريقة Optional.stream() لتحويل تدفق اختياري من كائن موظف إلى تدفق موظف حتى نتمكن من العمل على هذا النتيجة بكسل في رمز النتيجة. لفهم المزيد حول هذه الميزة مع المزيد من الأمثلة وقراءة المزيد من الطرق الجديدة المضافة إلى فئة Optional ، يرجى مراجعة البرنامج التعليمي الأصلي الخاص بي على: Java SE 9: تحسينات فئة Optional

تحسينات واجهة برمجة التطبيقات للتدفق

في Java SE 9 ، أضافت شركة Oracle Corp أربعة أساليب جديدة مفيدة إلى واجهة java.util.Stream. نظرًا لأن Stream هو واجهة ، فجميع أساليب التنفيذ الجديدة هي أساليب افتراضية. اثنان منهما مهمان جدًا: أساليب dropWhile و takeWhile. إذا كنت متعرفًا على لغة Scala أو أي لغة برمجة وظيفية أخرى ، فبالتأكيد ستعرف هذه الأساليب. هذه الأساليب مفيدة جدًا في كتابة بعض الشفرة بنمط وظيفي. دعنا نناقش هنا طريقة الاستخدام takeWhile. تأخذ هذه الأسلوب takeWhile() مثيلًا للدالة وترجع Stream لمجموعة القيم في ال Stream المحددة حتى تعود الدالة بقيمة false للمرة الأولى. إذا لم تستوفِ القيمة الأولى هذا الشرط ، فإنها تعيد مجموعة Stream فارغة.

jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
                 .forEach(System.out::println);
1
2
3
4

لقراءة المزيد عن طرق takeWhile و dropWhile وغيرها من الأساليب الجديدة ، يرجى الاطلاع على البرنامج التعليمي الأصلي الخاص بي في: Java SE 9: تحسينات واجهة Stream API

تعزيزالتعليق @Deprecated

في Java SE 8 والإصدارات السابقة، تُستخدم التعليقة @Deprecated كواجهة وسمية فقط بدون أي أساليب. يتم استخدامها لوسم Java API الذي هو فئة، أو حقل، أو طريقة، أو واجهة، أو بناء، أو تعداد، وما إلى ذلك. في Java SE 9، قامت Oracle Corp بتعزيز التعليقة @Deprecated لتوفير مزيد من المعلومات حول واجهة API المهجورة وأيضًا توفير أداة لتحليل استخدام التطبيق الثابت لواجهات API المهجورة. لقد أضافوا طريقتين إلى هذه الواجهة المهجورة: forRemoval و since لتقديم هذه المعلومات.

عميل HTTP 2

في Java SE 9، تعتزم Oracle Corp إصدار واجهة برمجة تطبيقات جديدة لعميل HTTP 2 لدعم بروتوكول HTTP/2 وميزات WebSocket. نظرًا لوجود العديد من المشاكل في واجهة برمجة تطبيقات عميل HTTP الحالية أو التقليدية (مثل دعم بروتوكول HTTP/1.1 وعدم دعم بروتوكول HTTP/2 وWebSocket، والعمل فقط في وضع الحجب ووجود العديد من مشاكل الأداء)، فإنهم يقومون بتبديل واجهة HttpURLConnection هذه بعميل HTTP جديد. وسوف يتم تقديم واجهة برمجة تطبيقات عميل HTTP 2 جديدة تحت حزمة “java.net.http”. تدعم كل من بروتوكولات HTTP/1.1 وHTTP/2. تدعم وضعين متزامنين (وضع الحجب) وأسينكرونيين. تدعم وضع الأسينكروني باستخدام واجهة WebSocket API. يمكننا رؤية هذه الواجهة البرمجية الجديدة على https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html مثال على عميل HTTP 2

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))

يرجى الاطلاع على البرنامج التعليمي الأصلي الخاص بي على: Java SE 9: عميل HTTP 2 لفهم بروتوكول HTTP/2 وWebSocket، فوائد الواجهة الجديدة وعيوب الواجهة القديمة مع بعض الأمثلة المفيدة.

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

في Java SE 9، تعتزم Oracle Corp تقديم واجهة برمجة تطبيقات صور متعددة الدقة جديدة. الواجهة الهامة في هذه الواجهة هي MultiResolutionImage. هي متوفرة في حزمة java.awt.image. تقوم MultiResolutionImage بتغليف مجموعة من الصور بارتفاعات وعرض مختلفة (أي دقات مختلفة) وتسمح لنا بالاستعلام عنها وفقًا لاحتياجاتنا.

ميزات Java 9 المتنوعة

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

  • تحسينات جمع القمامة (Garbage Collector)
  • واجهة برمجة التراكم (Stack-Walking API)
  • تصفية بيانات التسلسل الواردة
  • تهيئة واجهة برمجة التطبيقات (API) التابعة للتطبيقات
  • دمج سلاسل النصوص
  • تحسينات مقابض الأساليب
  • واجهة برمجة التسجيل والخدمة الخاصة بمنصة Java
  • سلاسل مضغوطة
  • واجهة برمجة التحليل لـ Nashorn
  • بحث Javadoc
  • Javadoc HTML5

I will pickup these java 9 features one by one and update them with enough description and examples. That’s all about Java 9 features in brief with examples.

Source:
https://www.digitalocean.com/community/tutorials/java-9-features-with-examples