Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الكلمة المفتاحية final

جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 13 من 87.

الكلمة المفتاحية final في Java تمنع التعديل. يمكن تطبيقها على المتغيرات، والدوال، والأصناف، ولكل منها تأثير مختلف.

عند تطبيقها على متغير، تجعل final منه ثابتاً - فبمجرد تعيين قيمته، لا يمكن تغييرها:

public class Circle {
    private final double PI = 3.14159;
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;  // يمكن التعيين مرة واحدة في المنشئ (constructor)
    }
    
    public void setRadius(double r) {
        // this.radius = r;  // خطأ! لا يمكن إعادة تعيين متغير نهائي (final)
    }
}

يجب تهيئة متغير final إما عند التصريح عنه أو في المنشئ (constructor). بعد ذلك، ستؤدي أي محاولة لإعادة تعيينه إلى حدوث خطأ في التصريف (compilation error).

بالنسبة لـ أنواع المراجع، تعني final أن المرجع لا يمكنه الإشارة إلى كائن مختلف، ولكن لا يزال بإمكان محتويات الكائن أن تتغير:

private final StringBuilder name = new StringBuilder("John");

// name = new StringBuilder("Jane");  // خطأ! لا يمكن إعادة التعيين
name.append(" Doe");  // جيد! يمكن أن تتغير محتويات الكائن

استخدام final مع الحقول يوضح الغرض بوضوح - فهو يخبر المطورين الآخرين أن هذه القيمة يجب ألا تتغير أبداً بعد التهيئة. وهذا مفيد بشكل خاص لقيم التكوين (configuration values)، أو المعرفات (IDs)، أو أي بيانات يجب أن تظل ثابتة طوال عمر الكائن.

challenge icon

التحدي

سهل

لنقم ببناء نظام تسجيل Student يستخدم الكلمة المفتاحية final لحماية البيانات التي لا يجب أن تتغير أبداً بعد تسجيل الطالب.

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • Student.java: أنشئ فئة Student حيث يتم قفل معلومات معينة بشكل دائم بمجرد تعيينها:
    • حقل final باسم studentId (String) - يتم تعيينه عند الإنشاء ولا يمكن تغييره أبداً
    • حقل final باسم enrollmentYear (int) - السنة التي التحق فيها الطالب، وهي أيضاً دائمة
    • حقل خاص (private) عادي باسم name (String) - يمكن تحديثه إذا قام الطالب بتغيير اسمه
    • منشئ (constructor) يأخذ القيم الثلاث جميعها ويقوم بتهيئة الحقول
    • دالة جلب getStudentId() لمعرف الطالب
    • دالة جلب getEnrollmentYear() لسنة الالتحاق
    • دالة جلب getName() ودالة تعيين setName() للاسم
    • دالة getInfo() تعيد: "ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
  • Main.java: أنشئ كائن Student، ثم قم بتحديث اسمه واعرض معلوماته. ستتلقى أربعة مدخلات: معرف الطالب، الاسم الأولي، سنة الالتحاق، واسم جديد للتحديث إليه. اطبع سطرين:
    • معلومات الطالب قبل تغيير الاسم
    • معلومات الطالب بعد تغيير الاسم

ستتلقى أربعة مدخلات بالترتيب: studentId (String)، و name (String)، و enrollmentYear (int)، و newName (String).

لاحظ كيف تحمي حقول final معرف الطالب وسنة التحاقه - فهذه سجلات دائمة لا ينبغي أن تتغير، بينما يمكن تحديث الاسم من خلال دالة التعيين الخاصة به.

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String studentId = scanner.nextLine();
        String name = scanner.nextLine();
        int enrollmentYear = scanner.nextInt();
        scanner.nextLine(); // استهلاك السطر الجديد
        String newName = scanner.nextLine();
        
        // TODO: إنشاء كائن Student بالقيم الأولية
        
        // TODO: طباعة معلومات الطالب قبل تغيير الاسم
        
        // TODO: تحديث اسم الطالب باستخدام الـ setter
        
        // TODO: طباعة معلومات الطالب بعد تغيير الاسم
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming