الواجهة في جافا هي أحد المفاهيم الأساسية. واجهة جافا هي جزء أساسي من لغة برمجة جافا وتستخدم كثيرًا ليس فقط في جي دي كي ولكن أيضًا في أنماط تصميم جافا. معظم الأطر العمل تستخدم الواجهة في جافا بشكل كبير.
واجهة في جافا
توفر الواجهة في جافا طريقة لتحقيق التجريد. كما يتم استخدام واجهة جافا لتعريف العقدة التي يجب على الفئات الفرعية تنفيذها. على سبيل المثال ، دعونا نفترض أننا نريد إنشاء رسم يتكون من أشكال متعددة. هنا يمكننا إنشاء واجهة بأسم “Shape” وتعريف جميع الطرق التي ستنفذها أشكال الشكل المختلفة. لأغراض البساطة ، يمكننا الاحتفاظ بطريقتين فقط – طريقة “draw()” لرسم الشكل وطريقة “getArea()” التي ستعيد مساحة الشكل.
مثال على واجهة جافا
بناءً على المتطلبات المذكورة أعلاه ، ستبدو واجهة الشكل لدينا على النحو التالي. “Shape.java”
package com.journaldev.design;
public interface Shape {
//صريحة بشكل ضمني ، ثابتة وعامة
public String LABLE="Shape";
//طرق الواجهة ضمنياً مجردة وعامة
void draw();
double getArea();
}
نقاط مهمة حول الواجهة في جافا
-
الواجهة
هو الكود الذي يستخدم لإنشاء واجهة في جافا. -
لا يمكننا إنشاء مثيل للواجهة في جافا.
-
توفر الواجهة تجريدًا كاملاً ، في المنشور السابق تعلمنا عن الفئات المجردة في جافا لتوفير التجريد ولكن يمكن للفئات المجردة أن تحتوي على تنفيذات الطرق بينما لا يمكن أن تحتوي الواجهة على طرق بجسم.
-
لا يمكن للواجهات أن تحتوي على بناء نظرًا لأننا لا يمكننا إنشاء مثيلات منها ولا يمكن للواجهات أن تحتوي على طريقة بجسم.
-
بشكل افتراضي، أي سمة في واجهة تكون عامة, ثابتة و نهائية، لذلك لا نحتاج إلى توفير واجهات وصول للسمات ولكن إذا قمنا بذلك، فإن المترجم لا يشتكي من ذلك أيضًا.
-
بشكل افتراضي، تكون طرق الواجهة مجردة وعامة، وهذا منطقي تمامًا لأن الطريقة ليس لديها جسم وبالتالي يمكن للفصول الفرعية توفير تنفيذ الطريقة.
-
لا يمكن لواجهة أن تمتد من أي فئة ولكنها يمكن أن تمتد من واجهة أخرى.
public interface Shape extends Cloneable{}
هو مثال على واجهة تمتد من واجهة أخرى. في الواقع، يوفر جافا التوريث المتعدد في الواجهات، مما يعني أنه يمكن لواجهة أن تمتد من واجهات متعددة. -
يتم استخدام الكلمة المفتاحية
implements
من قبل الفئات لتنفيذ واجهة. -
يجب على الفئة التي تنفذ واجهة توفير تنفيذ لجميع طرقها ما لم تكن فئة مجردة. على سبيل المثال ، يمكننا تنفيذ الواجهة المذكورة أعلاه في فئة مجردة مثل هذا:
ShapeAbs.java
package com.journaldev.design; public abstract class ShapeAbs implements Shape { @Override public double getArea() { // TODO Auto-generated method stub return 0; } }
-
يجب علينا دائمًا محاولة كتابة البرامج بناءً على الواجهات بدلاً من التنفيذات بحيث نعرف مسبقًا أن فئات التنفيذ ستوفر دائمًا التنفيذ وفي المستقبل إذا وصلت أي تنفيذة أفضل ، يمكننا التبديل إليها بسهولة.
مثال تنفيذ واجهة جافا
الآن دعنا نرى بعض أمثلة تنفيذ واجهتنا في جافا. Circle.java
package com.journaldev.design;
public class Circle implements Shape {
private double radius;
public Circle(double r){
this.radius = r;
}
@Override
public void draw() {
System.out.println("Drawing Circle");
}
@Override
public double getArea(){
return Math.PI*this.radius*this.radius;
}
public double getRadius(){
return this.radius;
}
}
لاحظ أن فئة Circle قد نفذت جميع الطرق المحددة في الواجهة ولديها بعض الطرق الخاصة بها أيضًا مثل getRadius()
. يمكن أن تحتوي تنفيذات الواجهة على أنواع متعددة من المباني. دعنا نرى تنفيذًا آخر لواجهة Shape. Rectangle.java
package com.journaldev.design;
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double w, double h){
this.width=w;
this.height=h;
}
@Override
public void draw() {
System.out.println("Drawing Rectangle");
}
@Override
public double getArea() {
return this.height*this.width;
}
}
لاحظ استخدام تعليق التجاوز ، تعرف على تعليقات في جافا و لماذا يجب علينا دائمًا استخدام تعليق التجاوز عند تجاوز طريقة في جافا. هنا برنامج اختبار يوضح كيفية البرمجة في سياق الواجهات وليس التنفيذات. ShapeTest.java
package com.journaldev.design;
public class ShapeTest {
public static void main(String[] args) {
//البرمجة للواجهات وليس للتنفيذات
Shape shape = new Circle(10);
shape.draw();
System.out.println("Area="+shape.getArea());
//التبديل من تنفيذ إلى آخر بسهولة
shape=new Rectangle(10,10);
shape.draw();
System.out.println("Area="+shape.getArea());
}
}
ناتج برنامج مثال الواجهة جافا أعلاه هو:
Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0
فوائد واجهة جافا
- توفر الواجهة عقدًا لجميع فئات التنفيذ ، لذلك من الجيد البرمجة في سياق الواجهات لأن فئات التنفيذ لا يمكنها إزالة الطرق التي نستخدمها.
- الواجهات جيدة كنقطة بداية لتحديد النوع وإنشاء هرم المستوى العلوي في الشفرة الخاصة بنا.
- نظرًا لأن فئة جافا يمكن أن تنفذ واجهات متعددة، فمن الأفضل استخدام الواجهات كفئة أساسية في معظم الحالات.
عيوب واجهة جافا
على الرغم من أن الواجهات توفر العديد من المزايا إلا أن لديها بعض العيوب أيضًا.
-
يجب علينا اختيار طرق الواجهة بعناية فائقة عند تصميم مشروعنا لأنه لا يمكننا إضافة أو إزالة أي طرق من الواجهة في وقت لاحق، وسيؤدي ذلك إلى وجود أخطاء في الترجمة لجميع فئات التنفيذ. في بعض الأحيان يؤدي ذلك إلى وجود العديد من الواجهات التي تمتد من الواجهة الأساسية في الكود، مما يصعب الصيانة.
-
إذا كان لدى فئات التنفيذ أساليبها الخاصة ، فلا يمكننا استخدامها مباشرة في الكود الخاص بنا لأن نوع الكائن هو واجهة لا تحتوي على تلك الأساليب. على سبيل المثال ، في الكود أعلاه سنحصل على خطأ في الترجمة للكود
shape.getRadius()
. للتغلب على ذلك ، يمكننا استخدام تحويل النوع واستخدام الأسلوب بهذه الطريقة:Circle c = (Circle) shape; c.getRadius();
على الرغم من أن تحويل النوع للفئة له عيوبه الخاصة.
هذا كل ما لدي للواجهة في جافا. نظرًا لأننا نستخدم الواجهة في جافا كثيرًا ، يجب علينا أن نكون على دراية بميزاتها. تأكد من استخدام الواجهات في تصميم النظام وكعقد بين العميل والفئات الفرعية التي تنفذ الواجهات. تحديث: قامت جافا 8 بتغيير تعريف الواجهات مع إدخال أساليب الافتراضي وأساليب الثابتة. لمزيد من التفاصيل ، يرجى قراءة واجهة جافا 8.
Source:
https://www.digitalocean.com/community/tutorials/interface-in-java