English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمية Java الأساسية

تحكم في العملية Java

مجموعات Java Array

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثنائات Java

قائمة Java List

Java Queue (مجموعة)

مجموعات Java Map

مجموعات Java Set

إدخال/إخراج Java (I/O)

قراء/كتابة Java

مواضيع أخرى Java

أنواع التغليف Java

في هذا الدليل، سنتعلم من خلال الأمثلة أنواع التغليف المختلفة في Java.

التغليف Java هو بيانات السطر المصدر للبرنامج (بيانات بيانات). قدمت Java SE عدة تغليف مسبقًا. بالإضافة إلى ذلك، يمكننا إنشاء تغليف مخصص حسب الحاجة.

إذا كنت لا تعرف ما هو التغليف، يرجى زيارةJava Annotationsدليل.

يمكن تصنيف هذه التغليفات إلى:

1. التغليف المعدة مسبقًا

  • @Deprecated

  • @Override

  • @SuppressWarnings

  • @SafeVarargs

  • @FunctionalInterface

2. التعليقات المخصصة

3. التعليقات العليا

  • @Retention

  • @Documented

  • @Target

  • @Inherited

  • @Repeatable

أنواع التغليف المعدة مسبقًا

1. @Deprecated

@Deprecated التغليف هو تغليف علامة يشير إلى أن العنصر (فئة، طريقة، حقل، إلخ) قد تم التخلي عنه ويتم استبداله بعنصر تم تحديثه.

جملته هي:

@Deprecated
accessModifier returnType deprecatedMethodName() { ... }

عند استخدام العناصر المضروبة في البرنامج، يولد محول الكود تحذيرًا.

نستخدم علامة @deprecated في Javadoc لتسجيل العناصر المضروبة.

/**
 * @deprecated
 * لماذا تم التخلي عنها
 */
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }

مثال1: @Deprecated التغليف مثال

class Main {
  /**
   * @deprecated
   * هذه الطريقة قد تم التخلي عنها وقد تم استبدالها بطريقة newMethod()
   */
  @Deprecated
  public static void deprecatedMethod() { 
    System.out.println("Deprecated method"); 
  } 
  public static void main(String args[]) {
    deprecatedMethod();
  }
}

نتائج الإخراج

طريقة @Deprecated

2. @Override

@Override التغليف يحدد طريقة في الفئة الفرعية باستخدام نفس اسم الطريقة ونوع العودة والقائمة بالمعلمات تغطي الطريقة في الفئة الأصلية.

@Override ليست ضرورية عند تعديل الطريقة، ولكن إذا تم استخدامه، فإنه إذا حدث خطأ (مثل نوع المعاملات غير صحيح)، فإن معالج البرمجة سيقدم خطأ.

مثال 2: مثال على ملاحظة @Override

class Animal {
  //مؤشر على تعديل الطريقة
  public void display(){
    System.out.println("أنا حيوان");
  }
}
class Dog extends Animal {
  //مؤشر على تعديل الطريقة
  @Override
  public void display(){
    System.out.println("أنا كلب");
  }
  public void printMessage(){
    display();
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printMessage();
  }
}

نتائج الإخراج

أنا كلب

في هذا المثال، من خلال إنشاء عنصر فئة Dog باسم dog1، يمكننا استدعاء طريقة printMessage() الخاصة بها، ثم تنفيذ جملة display().

بسبب أن display() تم تعريفها في كلا الكلاسات، سيقوم طريقة display() في فئة Dog النسخة الفرعية بتعديل طريقة display() في فئة Animal الأصلية. لذلك، سيتم استدعاء طريقة النسخة الفرعية.

3. @SuppressWarnings

كما يوحي الاسم، @SuppressWarnings ملاحظة تُشير إلى منع معالج البرمجة من عرض التحذيرات أثناء تشغيل البرنامج.

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

لمنع عرض تحذيرات فئة معينة، نستخدم عمداً:

@SuppressWarnings("warningCategory")

على سبيل المثال،

@SuppressWarnings("deprecated")

لمنع عرض تحذيرات عدة فئات، نستخدم عمداً:

@SuppressWarnings({"warningCategory1", "warningCategory2"})

على سبيل المثال،

@SuppressWarnings({"deprecated", "unchecked"})

عند استخدام العناصر غير الموصى بها، سيقوم إشارة "deprecated" بمنع عرض التحذيرات من قبل معالج البرمجة.

عند استخدام الأنواع الأصلية، سيقوم إشارة "unchecked" بمنع عرض التحذيرات من قبل معالج البرمجة.

وفي ذلك، سيتم تجاهل التحذيرات غير المحددة. على سبيل المثال،

@SuppressWarnings("someundefinedwarning")

مثال3: @SuppressWarnings ملاحظة مثال

class Main {
  @Deprecated
  public static void deprecatedMethod() { 
    System.out.println("Deprecated method"); 
  } 
  
  @SuppressWarnings("deprecated")
  public static void main(String args[]) {
    Main depObj = new Main();
    depObj. deprecatedMethod();
  }
}

نتائج الإخراج

طريقة @Deprecated

في هذا السياق، تم تسمية deprecatedMethod() بـ @Deprecated، مما يؤدي إلى إرسال تحذير من مُعالج البرمجة عند الاستخدام. يمكننا تجنب التحذير من خلال استخدام ملاحظة @SuppressWarnings("deprecated").

4. @SafeVarargs

يؤكد @SafeVarargs ملاحظة أن الطريقة أو الكونструктор المزود بالملاحظة لا تقوم بتنفيذ عمليات غير آمنة على متغيرات الأ参数 المتغيرات (عدد المتغيرات القابلة للتغيير).

لا يمكننا استخدام هذه الملاحظة إلا في الطرق أو كونструкторات لا يمكن تعريفها. لأن تعريفها قد يؤدي إلى تنفيذ عمليات غير آمنة.

قبل Java 9، كنا نستطيع استخدام هذه الملاحظة فقط في الطرق النهائية أو الثابتة، لأنها لا يمكن أن تُعيد تعريفها. الآن، يمكننا أيضًا استخدام هذه الملاحظة في الطرق الخاصة.

مثال4: @SafeVarargs ملاحظة مثال

import java.util.*;
class Main {
  private void displayList(List<String>... lists) {
    for (List<String> list : lists) {
      System.out.println(list);
    }
  }
  public static void main(String args[]) {
    Main obj = new Main();
    List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University");
    obj.displayList(universityList);
    List<String> programmingLanguages = Arrays.asList("Java", "C");
    obj.displayList(universityList, programmingLanguages);
  }
}

ملاحظات التحذير

أمان النوع: إمكانية تلوث المخزون عبر معاملات متعددة
أمان النوع: يتم إنشاء مصفوفة عامة من List<String> لمعاملات متعددة 
 مفردة

نتائج الإخراج

ملاحظة: يستخدم Main.java عمليات غير مفحوصة أو غير آمنة.
[جامعة Tribhuvan، جامعة Kathmandu]
[جامعة Tribhuvan، جامعة Kathmandu]
[Java, C]

في هذا، يتم تحديد نوع List ... list كنوع List للمعاملات المتعددة. هذا يعني أن يمكن أن يكون لديها صفر أو أكثر من المعاملات.

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

عند استخدام تعليمة @SafeVarargs في المثال السابق،

@SafeVarargs
 private void displayList(List<String>... lists) { ... }

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

5. @FunctionalInterface

أدخل Java 8 تعليمة @FunctionalInterface هذه. تحدد هذه التعليمة أن النوع الذي يستخدمها هو واجهة وظيفية. واجهة وظيفية يمكن أن تحتوي على طريقة مجردة واحدة فقط.

مثال 5: مثال على تعليمة @FunctionalInterface

@FunctionalInterface
public interface MyFuncInterface{
  public void firstMethod(); // هذا هو طريقة مجردة
}

إذا أضفنا طريقة مجردة أخرى، فإن

@FunctionalInterface
public interface MyFuncInterface{
  public void firstMethod(); // هذا هو طريقة مجردة
  public void secondMethod(); // هذا سيتسبب في خطأ في التجميع
}

الآن، عندما نقوم بتشغيل البرنامج، سنحصل على تحذيرات التالي:

تعليمة @FunctionalInterface غير متوقعة
@FunctionalInterface ^ واجهة MyFuncInterface ليست واجهة وظيفية
وجدت العديد من الطرق الموجودة في واجهة MyFuncInterface بدون تكرار

استخدام تعليق @FunctionalInterface ليس إلزاميًا. سيقوم المترجم بتعيين أي واجهة تفي بتعريف واجهة الوظيفة كواجهة وظيفية.

هدف استخدام هذا التعليق هو التأكد من أن واجهة الوظيفة تحتوي على طريقة抽象ة واحدة فقط.

لكن، يمكن أن يكون لديها أي عدد من الطرق الافتراضية والطرق الثابتة، لأنها لها تنفيذ.

@FunctionalInterface
public interface MyFuncInterface{
  public void firstMethod(); // هذه هي طريقة抽象ة
  default void secondMethod() { ... } 
  default void thirdMethod() { ... } 
}

التعليقات المخصصة

يمكننا أيضًا إنشاء تعليقات مخصصة الخاصة بنا.

جملته هي:

[Access Specifier] @interface<AnnotationName> {         
  DataType <MethodName>() [default value];
}

هذه هي المعلومات التي تحتاج إلى معرفتها حول التعليقات المخصصة:

  • يمكن إنشاء تعليق باستخدام @interface تتبع اسم التعليق.

  • يمكن أن يكون لديها عناصر تبدو كطرق ولكنها ليست لها تنفيذ.

  • القيمة الافتراضية اختيارية. لا يمكن أن تكون القيمة للمعامل صفر.

  • يمكن أن يكون نوع العودة أصلي، قائمة، نص، اسم فئة أو مجموعة من هذه الأنواع.

مثال 6: مثال على تعليق مخصص

@interface MyCustomAnnotation {
  String value() default "default value";
}
class Main {
  @MyCustomAnnotation(value = "w3codebox")
  public void method1() {
    System.out.println("اختبار طريقة 1");
  }
  public static void main(String[] args) throws Exception {
    Main obj = new Main();
    obj.method1();
  }
}

نتائج الإخراج

اختبار طريقة 1

التعليقات العليا

التعليقات العليا هي التعليقات التي تطبق على التعليقات الأخرى.

1. @Retention

@Retention تُحدد مستوى الاستخدام الأعلى للتعليق.

جملته هي:

@Retention(RetentionPolicy)

هناك ثلاثة أنواع:

  • RetentionPolicy.SOURCE - التعليقات متاحة فقط على مستوى المصدر ويتم تجاهلها من قبل المترجم.

  • RetentionPolicy.CLASS - يمكن استخدام التعليق من قبل محرر الكود في وقت التجميع، ولكن سيقوم محرك JVM بتخطيه.

  • RetentionPolicy.RUNTIME - يمكن استخدام التعليق في JVM.

على سبيل المثال،

@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{ ... }

2. @Documented

بالتقديم، لا يتم تضمين التعليقات المخصصة في وثائق Java الرسمية. إذا كنت ترغب في تضمين التعليق في وثائق Javadoc، استخدم تعليق @Documented.

على سبيل المثال،

@Documented
public @interface MyCustomAnnotation{ ... }

3. @Target

يمكننا استخدام تعليق @Target لتحديد التعليق لتطبيقه على هدف معين.

جملته هي:

@Target(ElementType)

يمكن أن يكون نوع ElementType أحد الأنواع التالية:

نوع العنصرالهدف
ElementType.ANNOTATION_TYPEنوع التعليق
ElementType.CONSTRUCTORالمكوّنات
ElementType.FIELDالمجالات
ElementType.LOCAL_VARIABLEالمتغيرات المحلية
ElementType.METHODالطريقة
ElementType.PACKAGEالباقة
ElementType.PARAMETERالمواضيع
ElementType.TYPEلإدراج تصنيفات الفئات، أو واجهات (بما في ذلك أنواع التعليقات) أو تصنيفات enum.

على سبيل المثال،

@Target(ElementType.METHOD)
public @interface MyCustomAnnotation{ ... }

في هذا المثال، قصرنا استخدام هذا التعليق على الطريقة فقط.

ملاحظة:إذا لم يتم تعريف نوع الهدف، يمكن استخدام التعليق لأي عنصر.

4. @Inherited

بالتقديم، لا يمكن للنوع من التعليقات أن يرث من الفئة الأم. ولكن إذا كنت بحاجة إلى تمرير التعليق من الفئة الأم إلى الفئة البنت، يمكنك استخدام تعليق @Inherited.

جملته هي:

@Inherited

على سبيل المثال،

@Inherited
public @interface MyCustomAnnotation { ... }
@MyCustomAnnotation
public class ParentClass{ ... }
public class ChildClass extends ParentClass { ... }

5. @Repeatable

التعليق المزود بعلامة @Repeatable يمكن تطبيقه مرارًا وتكرارًا على نفس البيان.

@Repeatable(Universities.class)
public @interface University {
  String name();
}

القيمة المحددة في وسم @Repeatable هو وسم حاوي. وسم الحاوي يحتوي على قيمة للفئات القابلة للتكرار (value). هنا، Universities هي التي تحتوي على الفئات الم标注ة.

public @interface Universities {
  University[] value();
}

الآن، يمكن استخدام علامة @University عدة مرات في نفس التصريح.

@University(name = "TU")
@University(name = "KU")
private String uniName;

إذا كنت بحاجة إلى البحث عن بيانات العلامة، يمكنك استخدامالتفكير.

للبحث عن قيمة العلامة، نستخدم طريقة getAnnotationsByType() أو getAnnotations() المحددة في API الت反射.