الكلمة المفتاحية 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 مع الحقول يوضح القصد بوضوح - فهو يخبر المطورين الآخرين أن هذه القيمة يجب ألا تتغير أبداً بعد التهيئة. وهذا مفيد بشكل خاص لقيم التكوين، أو المعرفات، أو أي بيانات يجب أن تظل ثابتة طوال عمر الكائن.
التحدي
سهللنقم ببناء نظام تسجيل 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 معرف الطالب وسنة التحاقه - فهذه سجلات دائمة لا ينبغي أن تتغير، بينما يمكن تحديث الاسم من خلال دالة التعيين الخاصة به.
ورقة مرجعية
الكلمة المفتاحية final تمنع التعديل في Java. يمكن تطبيقها على المتغيرات، والأساليب (methods)، والفئات (classes).
عند تطبيقها على متغير، تجعل 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).
بالنسبة لـ أنواع المراجع (reference types)، تعني final أن المرجع لا يمكنه الإشارة إلى كائن مختلف، ولكن لا يزال بإمكان محتويات الكائن التغيير:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // خطأ! لا يمكن إعادة التعيين
name.append(" Doe"); // مقبول! يمكن تغيير محتويات الكائناستخدام final مع الحقول (fields) يوضح الغرض - فهو يشير إلى أن القيمة يجب ألا تتغير أبداً بعد التهيئة، وهو أمر مفيد لقيم التكوين (configuration values)، أو المعرفات (IDs)، أو البيانات الثابتة.
جرّب بنفسك
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: طباعة معلومات الطالب بعد تغيير الاسم
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر