خاصية Interface (الواجهة) في لغة جافا هي مفهوم برمجي قوي يسمح بتحديد مجموعة من الطرق (methods) بدون تحديد كيفية تنفيذ هذه الطرق. بمعنى آخر، الواجهة تحدد "عقدًا" يجب على أي صنف (class) "يُنفذ" (implements) هذه الواجهة أن يلتزم به، أي يجب عليه توفير تعريفات (implementations) لجميع الطرق المُعلنة في الواجهة.

شرح مُفصل:

  • تعريف الواجهة: يتم تعريف الواجهة باستخدام الكلمة المفتاحية interface، ويتبعها اسم الواجهة، ثم يتم وضع تعريفات الطرق داخل أقواس معقوفة {}. لا تحتوي الطرق في الواجهة على أي جسم (body)، أي لا يوجد بها كود تنفيذي.

    Java
    interface Drawable {
    void draw(); // طريقة بدون تنفيذ
    int getNumberOfSides(); // طريقة أخرى بدون تنفيذ
    }
  • تنفيذ الواجهة: يمكن لصنف أن "يُنفذ" واجهة باستخدام الكلمة المفتاحية implements. يجب على الصنف الذي يُنفذ واجهة أن يُوفر تعريفًا (implementation) لكل طريقة مُعلنة في الواجهة.

    Java
    class Circle implements Drawable {
    @Override
    public void draw() {
    System.out.println("Drawing a circle");
    }

    @Override
    public int getNumberOfSides() {
    return 0; // الدائرة ليس لها أضلاع
    }
    }

    class Square implements Drawable {
    @Override
    public void draw() {
    System.out.println("Drawing a square");
    }

    @Override
    public int getNumberOfSides() {
    return 4;
    }
    }
  • فوائد استخدام الواجهات:

    • تحقيق التجريد (Abstraction): تُمكن الواجهات من فصل تعريف الطريقة عن تنفيذها، مما يُحسن من تصميم البرنامج ويجعله أكثر مرونة وقابلية للصيانة.

    • تحقيق تعدد الأشكال (Polymorphism): يُمكن التعامل مع الكائنات من أنواع مختلفة (التي تُنفذ نفس الواجهة) بطريقة موحدة. ففي المثال السابق، يُمكن التعامل مع كائنات Circle و Square على أنها كائنات من نوع Drawable.

      Java
      Drawable d = new Circle(); // يُمكن الإشارة إلى كائن Circle كـ Drawable
      d.draw(); // سيتم استدعاء طريقة draw الخاصة بـ Circle

      d = new Square(); // يُمكن الإشارة إلى كائن Square كـ Drawable
      d.draw(); // سيتم استدعاء طريقة draw الخاصة بـ Square
    • تجنب مشكلة الوراثة المتعددة (Multiple Inheritance): لا تدعم جافا الوراثة المتعددة من الأصناف (class)، ولكنها تسمح للصنف بتنفيذ أكثر من واجهة، مما يُحقق بعض فوائد الوراثة المتعددة بدون تعقيداتها.

    • إنشاء عقود بين الكائنات: تُحدد الواجهات "عقدًا" يجب على الأصناف الالتزام به، مما يُسهل عملية تطوير البرامج الجماعية.

  • بعض النقاط الهامة حول الواجهات:

    • جميع الطرق في الواجهة افتراضياً public و abstract.
    • يُمكن للواجهة أن تحتوي على ثوابت (constants) وهي افتراضياً public, static, و final.
    • بدءًا من Java 8، يُمكن للواجهات أن تحتوي على طرق افتراضية (default methods) ولها تنفيذ افتراضي، وطرق ثابتة (static methods).

مثال شامل:

Java
interface Shape {
double getArea();
double getPerimeter();
}

class Rectangle implements Shape {
private double length;
private double width;

public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}

@Override
public double getArea() {
return length * width;
}

@Override
public double getPerimeter() {
return 2 * (length + width);
}
}

public class Main {
public static void main(String[] args) {
Rectangle r = new Rectangle(5, 10);
System.out.println("Area: " + r.getArea());
System.out.println("Perimeter: " + r.getPerimeter());
}
}

في هذا المثال، تُحدد الواجهة Shape طريقتين لحساب المساحة والمحيط. يُنفذ الصنف Rectangle هذه الواجهة ويُوفر تعريفات لهذه الطرق.

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