الدوال الساكنة
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 16 من 87.
تماماً كما تنتمي المتغيرات الساكنة (static variables) إلى الفئة (class) بدلاً من الكائنات (instances)، فإن الأساليب الساكنة (static methods) تنتمي أيضاً إلى الفئة نفسها. يمكنك استدعاؤها دون إنشاء كائن (object).
قم بالتصريح عن دالة ثابتة (static method) بإضافة الكلمة المفتاحية static:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
public static int multiply(int a, int b) {
return a * b;
}
}
// استدعاء بدون إنشاء كائن
int sum = MathHelper.add(5, 3); // 8
int product = MathHelper.multiply(4, 2); // 8للطرق الساكنة (Static methods) قيد واحد مهم: فهي لا يمكنها الوصول إلى متغيرات الكائنات (instance variables) أو طرق الكائنات (instance methods) بشكل مباشر. وبما أن الطرق الساكنة توجد بدون كائن، فلا يوجد مرجع this للعمل معه.
public class Counter {
private int count; // متغير كائن (Instance variable)
private static int total; // متغير ساكن (Static variable)
public static void incrementTotal() {
total++; // صحيح - الوصول إلى متغير ساكن
// count++; // خطأ! لا يمكن الوصول إلى متغير كائن
}
}تعد الطرق الساكنة (Static methods) مثالية للعمليات المساعدة التي لا تعتمد على حالة الكائن - فكر في طرق مثل Math.sqrt() أو Integer.parseInt(). فهي توفر وظائف تكون منطقية على مستوى الفئة بدلاً من الكائنات الفردية.
التحدي
سهللنقم ببناء فئة أدوات مساعدة StringUtils توفر طرقاً مفيدة لمعالجة النصوص دون الحاجة إلى إنشاء أي كائنات - وهي مثالية لاستعراض الطرق الساكنة (static methods)!
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
StringUtils.java: أنشئ فئة أدوات مساعدة تحتوي على طرق ساكنة (static methods) تؤدي عمليات نصية شائعة:- طريقة ساكنة
countVowels(String text)تعيد عدد الحروف المتحركة (a, e, i, o, u - سواء كانت كبيرة أو صغيرة) في النص المعطى. - طريقة ساكنة
reverse(String text)تعيد النص معكوساً. - طريقة ساكنة
isPalindrome(String text)تعيدtrueإذا كان النص يُقرأ بنفس الطريقة من الأمام والخلف (غير حساس لحالة الأحرف)، وfalseخلاف ذلك.
- طريقة ساكنة
Main.java: استخدم فئة الأدوات المساعدة الخاصة بك لمعالجة نص. ستتلقى مدخلاً واحداً: سلسلة نصية. استدعِ كل طريقة ساكنة مباشرة من خلال اسم الفئة واطبع ثلاثة أسطر:Vowels: [count]Reversed: [reversed string]Palindrome: trueأوPalindrome: false
ستتلقى مدخلاً واحداً: سلسلة نصية لتحليلها.
تذكر أن الطرق الساكنة (static methods) يتم استدعاؤها باستخدام اسم الفئة (مثل StringUtils.countVowels(text)) بدلاً من إنشاء كائن أولاً. وهذا يجعل فئات الأدوات المساعدة مريحة للعمليات التي لا تحتاج إلى الحفاظ على أي حالة بين الاستدعاءات.
ورقة مرجعية
تنتمي الأساليب الثابتة (Static methods) إلى الفئة نفسها ويمكن استدعاؤها دون إنشاء كائن. قم بالتصريح عنها باستخدام الكلمة المفتاحية static:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
}
// استدعاء دون إنشاء كائن
int sum = MathHelper.add(5, 3); // 8قيد هام: لا يمكن للأساليب الثابتة الوصول إلى متغيرات النسخة (instance variables) أو أساليب النسخة (instance methods) مباشرة، لأنها توجد بدون كائن وليس لها مرجع this:
public class Counter {
private int count; // متغير نسخة
private static int total; // متغير ثابت
public static void incrementTotal() {
total++; // صحيح - الوصول إلى متغير ثابت
// count++; // خطأ! لا يمكن الوصول إلى متغير نسخة
}
}تعتبر الأساليب الثابتة مثالية لعمليات الأدوات المساعدة التي لا تعتمد على حالة الكائن، مثل Math.sqrt() أو Integer.parseInt().
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
// TODO: استخدم أساليب StringUtils الثابتة لتحليل النص
// استدعِ StringUtils.countVowels(text) للحصول على عدد الحروف المتحركة
// استدعِ StringUtils.reverse(text) للحصول على النص معكوساً
// استدعِ StringUtils.isPalindrome(text) للتحقق مما إذا كان النص متناظراً
// TODO: اطبع النتائج بالتنسيق التالي:
// Vowels: [count]
// Reversed: [reversed string]
// Palindrome: true/false
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر