مطابقة الأنماط مع instanceof
ربط متغير أثناء اختبار النوع
مطابقة الأنماط مع instanceof درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
مطابقة الأنماط مع instanceof
كانت الطريقة القديمة لاستخدام instanceof تقوم على الاختبار ثم التحويل النوعي. أما مطابقة الأنماط فتجمع الاختبار والتحويل في خطوة واحدة، وتربط متغيرًا من النوع المناسب عند نجاح الاختبار.
التكرار البرمجي القديم
يتحقق الكود التقليدي من النوع، ثم يحوّل القيمة إلى متغير جديد. وهذا أسلوب متكرر ويسهل الوقوع في الأخطاء فيه.
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
}
}الصيغة الجديدة
يعرّف نمط النوع المتغير داخل التعبير مباشرةً: if (obj instanceof String s). وعند تحقق الشرط، يكون s هو القيمة المحوّلة نوعيًا بالفعل.
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) {
System.out.println(s.length());
}
}
}متغير الربط
يُسمّى المتغير s متغير النمط. ويكون نطاقه متاحًا حيثما يستطيع المصرّف إثبات نجاح مطابقة النمط، مما يجعل الكود أقصر وأكثر أمانًا.
استخدامه في الشروط
يمكنك ضمن شرط if نفسه استخدام متغير النمط بعد &&، لأن نجاح المطابقة مضمون في ذلك الفرع.
public class Main {
public static void main(String[] args) {
Object obj = "developer";
if (obj instanceof String s && s.length() > 5) {
System.out.println("Long string: " + s);
}
}
}النفي ونطاق التدفق
مع النفي يتغير النطاق بذكاء. بعد if (!(obj instanceof String s)) return;، يصبح المتغير s متاحًا في بقية الأسلوب، لأن التنفيذ لا يستمر إلا عندما تكون المطابقة ناجحة.
public class Main {
static int safeLength(Object obj) {
if (!(obj instanceof String s)) {
return -1;
}
return s.length();
}
public static void main(String[] args) {
System.out.println(safeLength("abc"));
System.out.println(safeLength(42));
}
}استبدال equals والتحويل النوعي
من الاستخدامات النموذجية كتابة تجاوز نظيف لـ equals: اختبر النوع واربط المتغير في سطر واحد، ثم قارن الحقول.
public class Main {
static final class Point {
final int x, y;
Point(int x, int y) { this.x = x; this.y = y; }
public boolean equals(Object o) {
return o instanceof Point p && p.x == x && p.y == y;
}
public int hashCode() { return x * 31 + y; }
}
public static void main(String[] args) {
System.out.println(new Point(1, 2).equals(new Point(1, 2)));
System.out.println(new Point(1, 2).equals(new Point(3, 4)));
}
}معالجة الأنواع المختلطة
تتيح فروع else if المتسلسلة مع الأنماط التوزيع على عدة أنواع محتملة بطريقة واضحة.
public class Main {
static String describe(Object obj) {
if (obj instanceof Integer i) {
return "int " + (i * 2);
} else if (obj instanceof String s) {
return "string of length " + s.length();
} else {
return "unknown";
}
}
public static void main(String[] args) {
System.out.println(describe(21));
System.out.println(describe("hello"));
System.out.println(describe(3.14));
}
}لا تتم مطابقة null مطلقًا
يكون نمط instanceof بقيمة false عند null، تمامًا مثل العامل التقليدي. لذلك لا يتم أبدًا إسناد null إلى متغير النمط، مما يزيل مصدرًا شائعًا لاستثناءات NPE.
public class Main {
public static void main(String[] args) {
Object obj = null;
if (obj instanceof String s) {
System.out.println("matched: " + s);
} else {
System.out.println("null or not a String");
}
}
}تعليمة أوضح وأكثر أمانًا
تزيل مطابقة الأنماط التحويل النوعي الزائد، وتضيّق النطاق بحيث لا يمكنكم إساءة استخدام المتغير، كما أن قراءتها تكاد تكون مثل قراءة الإنجليزية. وهي الأسلوب المفضل في Java الحديثة.
تجميع العناصر معًا
موزّع صغير ينسّق مدخلات مختلفة باستخدام الأنماط.
public class Main {
static String format(Object o) {
if (o instanceof Double d) return String.format("%.1f", d);
if (o instanceof Integer i) return Integer.toString(i);
if (o instanceof String s && !s.isBlank()) return s.trim();
return "n/a";
}
public static void main(String[] args) {
System.out.println(format(3.14159));
System.out.println(format(99));
System.out.println(format(" spaced "));
System.out.println(format(null));
}
}اختبار سريع
اختبروا مدى فهمكم لأنماط instanceof.
مراجعة
لقد تعلمتم مطابقة الأنماط باستخدام instanceof.
- تدمج اختبار النوع والتحويل النوعي في تعبير واحد.
- يقتصر نطاق متغير النمط على الموضع الذي ثبتت فيه المطابقة.
- تكون الأنماط بقيمة false عند null، مما يتجنب استثناءات NPE.
- تبسّط إعادة تعريف equals وتوزيع الأنواع.
الأسئلة الشائعة
هل درس «مطابقة الأنماط مع instanceof» مجاني؟
نعم — نص درس «مطابقة الأنماط مع instanceof» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «مطابقة الأنماط مع instanceof»؟
ربط متغير أثناء اختبار النوع تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مطابقة الأنماط مع instanceof»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مطابقة الأنماط مع instanceof
- أنماط Record
- أنماط Record المتداخلة
- الأنماط في switch