الكلمة المفتاحية var
الكلمة المفتاحية var
قدّم Java 10 الكلمةَ var — وهي اسم نوع محجوز يتيح للمُصرِّف استنتاج نوع المتغيّر المحلي من خلال قيمة التهيئة. وعلى الرغم من أنّها تبدو مشابهة للأنواع الديناميكية في JavaScript أو Kotlin، إلّا أنّ var في Java صارمة الطابع الساكن: يُحدَّد النوع في وقت الترجمة، ويظل ثابتًا طوال عمر المتغيّر، والبايت كود الناتج مطابق تمامًا لما ينتج عن كتابة النوع الصريح بنفسك.
أين يُسمح باستخدام var
يُعدّ استخدام var مشروعًا في هذه المواضع تحديدًا:
- تعريفات المتغيّرات المحلية داخل الدوال والبنّاءات وكتل التهيئة — بشرط وجود قيمة تهيئة على السطر نفسه.
- متغيّر الحلقة في حلقة for المحسّنة (
for (var item : list)). - متغيّر التكرار في حلقة for التقليدية (
for (var i = 0; i < n; i++)). - متغيّرات try-with-resources (
try (var reader = ...)).
في كل مكان آخر — معاملات الدوال، أنواع الإرجاع، معاملات البنّاء، الحقول، معاملات catch، معاملات تعبيرات lambda — لا يُسمح باستخدام var.
var دون خطأ في الترجمة — لكنّك بالطبع لا ينبغي أن تفعل ذلك.
الاستنتاج الأساسي في العمل
يستبدل المُصرِّف var بالنوع الساكن للطرف الأيمن من التعبير:
لاحظ في المثال الثاني أنّ معامل النوع يجب أن يظهر على الطرف الأيمن عند استخدام var، لأنّ المُصرِّف لا يملك أيّ مصدر آخر للاستنتاج. var x = new HashMap<>() ستُفضي إلى استنتاج HashMap<Object, Object> — وهو على الأرجح ليس ما تريده.
var مع Streams وتعبيرات Lambda
من أكثر الاستخدامات العملية لـ var تهدئة الأنواع الوسيطة المطوّلة في مسارات البث وكتل try-with-resources:
var في حلقات for المحسّنة
ربما تكون حلقة for المحسّنة المكانَ الوحيد الذي تبرز فيه var بأجلى صورة وأكثرها اتساقًا — إذ تُلغي تكرار النوع حين يكون نوع العنصر واضحًا من نوع المجموعة أصلًا:
إضافة التعليقات التوضيحية إلى var
يمكنك إضافة تعليقات توضيحية إلى متغيّر var تمامًا كما تفعل مع المتغيّر ذي النوع الصريح:
قابلية القراءة — المقايضة الحقيقية
var أداةٌ لتحسين قابلية القراءة، وليست حيلةً لإخفاء الأنواع. السؤال الجوهري دائمًا: "هل يستطيع القارئ تحديد النوع من السياق في نفس السطور القليلة؟"
استخدم var حين يكون النوع واضحًا أو غير ذي أهمية للقارئ:
تجنّب var حين تُخفي معلومات يحتاجها القارئ:
var تُحسّن القراءة. أمّا إذا كنت تستدعي دالة ذات اسم غامض، فضّل النوع الصريح.
ما لا تستطيع var فعله
نظرًا لأنّ الاستنتاج يحتاج إلى نوع محدَّد من قيمة التهيئة، فإنّ هذه الحالات كلّها تُولّد أخطاء في الترجمة:
var بعد تعريفه، وسيرفض المُصرِّف ذلك. هذا لا يشبه var في JavaScript بأيّ شكل.
التفاعل مع الأنواع الجنيسة ومشغّل الماسة
حين يستخدم الطرف الأيمن مشغّل الماسة (<>) وكانت var على اليسار، يُوسّع المُصرِّف معامل النوع الجنيس إلى Object:
الخلاصة
تُقلّل var من الفوضى البصرية في المتغيّرات المحلية حين يكون النوع واضحًا من الطرف الأيمن. وهي مفيدة بشكل خاص مع الأنواع الجنيسة، ومسارات البث، وحلقات for المحسّنة، وكتل try-with-resources. اسأل دائمًا: هل إزالة النوع الصريح تجعل الكود أوضح أم مجرّد أقصر؟ فليس المعنيان واحدًا. في الدرس التالي نتعرّف على كتل النص، ميزة Java الحديثة الأخرى المُصمَّمة أصلًا لتحسين القراءة.