JavaRush /مدونة جافا /Random-AR /استراحة القهوة رقم 121. ما هو Classpath في Java وكيفية تث...

استراحة القهوة رقم 121. ما هو Classpath في Java وكيفية تثبيته؟ الثبات في جافا

نشرت في المجموعة

ما هو Classpath في Java وكيفية تثبيته؟

المصدر: Medium معرفة أساسيات البرمجة وتدفق تنفيذ ملفات البرنامج يساعدنا على فهم اللغة. تعد معرفة معلمة Classpath أحد المفاهيم الأساسية التي يجب أن يعرفها كل مطور Java. سنناقش اليوم ماهية مسار الفصل ( Classpath ) وكيفية تعيينه وكيف يساعد JVM في تنفيذ ملفات الفصل. استراحة القهوة رقم 121.  ما هو Classpath في Java وكيفية تثبيته؟  الثبات في جافا - 1

ما هو كلاس باث؟

يعد Classpath أحد المعلمات الأساسية في Java، ولكن غالبًا ما يساء فهمه من قبل القادمين الجدد إلى البرمجة. للتبسيط، Classpath هو ببساطة مجموعة من المسارات التي يجب على مترجم Java وJVM العثور على الفئات الضرورية لتجميعها أو تنفيذها.

كيف يساعد Classpath JVM في تنفيذ ملفات الفصل

لنبدأ بمثال. لنفترض أن لدينا ملف Main.java الموجود في المجلد /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java .
package com.programming.v1;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello classpath");
    }
}
لنفترض أننا في /Users/vikram/Documents ونريد تجميع هذا الفصل:
javac test-java/src/com/programming/v1/Main.java
الآن، لتنفيذ ملف الفئة هذا، نحتاج إلى إخبار Java Virtual Machine بمكان البحث عن ملف .class باستخدام classpath أو علامة cp في أمر java .
vg@lp1 Documents % java -cp "test-java/src" com.programming.v1.Main
Hello classpath
vg@lp1 Documents % java -classpath "test-java/src" com.programming.v1.Main
Hello classpath
المعلمة الأولى هي المجلد الجذر حيث تمت كتابة الحزمة. المعلمة الثانية هي اسم الحزمة مع اسم الفئة. عند تنفيذ أمر Java، يبحث Java Virtual Machine في المجلد test-java/src ثم يقوم بتحميل الفئة الرئيسية لتنفيذه.

كيفية تعيين متغير Classpath

يمكن تعيين متغير Classpath كما هو موضح أدناه على أجهزة Linux:
export CLASSPATH="test-java/src"
يمكن إضافة/تحديث Classpath على جهاز يعمل بنظام Windows باستخدام متغيرات البيئة. بمجرد تعيين متغير البيئة، يمكن تنفيذ أمر Java كما هو موضح أدناه:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
هذا كل ما يمكن معرفته عن Classpath . شكرا لقرائتك!

الثبات في جافا

المصدر: المتغيرات المتوسطة في Java هي نوعان: بدائية ومرجعية. يتم تمرير كل شيء في Java حسب القيمة، ولكن في حالة الأنواع المرجعية، يمكن تحديث البيانات المصدر باستخدام عنوان الذاكرة الذي تم تمريره. استراحة القهوة رقم 121.  ما هو Classpath في Java وكيفية تثبيته؟  الثبات في جافا - 2يتم استخدام الكلمة الأساسية النهائية لجعل المتغير يعمل كثابت، أي تجنب إعادة التعيين. يعمل هذا بشكل جيد مع العناصر الأولية التي لا تحتوي على ذاكرة كومة، في حين أن إعادة التعيين فقط للأنواع المرجعية تكون محدودة ويمكن تغيير الحالة الداخلية. يمكن أن يؤدي هذا إلى العديد من مشكلات التزامن وظروف السباق. وبالتالي، فإن تضمين الخصائص غير القابلة للتغيير في النوع العادي في Java يوفر العديد من الفوائد.

فوائد الثبات في جافا

1. سلامة الخيط

الأنواع غير القابلة للتغيير محصنة ضد ظروف السباق في بيئة متعددة الخيوط لأن الكائن سيظل ثابتًا بعد إنشائه. لا يمكن لخيوط متعددة تغيير حالتها الداخلية، لذا فإن المزامنة غير مطلوبة.

2. النوع الأساسي

تعد السلسلة الموجودة في مكتبة Java القياسية مثالاً جيدًا للفئة الأساسية. هذه فئة بسيطة للغاية وغير قابلة للتغيير ويمكن استخدامها لبناء مجالات منطق الأعمال فوقها. وبالمثل، يمكن للنوع غير القابل للتغيير أن يكون بمثابة نوع أساسي رائع يمكن البناء عليه.

صفات

1. الحقول الخاصة والنهائية

الحقول التي تحتوي على حالة الكائن هي حقول خاصة ونهائية . تمنع الرؤية الخاصة الوصول المباشر إلى الحقل، بينما تضمن الرؤية النهائية تعيين الحقل مرة واحدة فقط.

2. لا توجد طرق معدلة

لا يمكن الوصول إلى الحقل الخاص خارج الفصل الدراسي. عادةً، يتم توفير طرق الوصول (الحروف) وطرق التعديل (المحددات)، على التوالي، لقراءة الحقول والكتابة إليها. لضمان الاتساق، لا يسمح بالمعدلات.

3. الفصل النهائي

قد يؤدي السماح بميراث الفئة إلى كسر الثبات. يمكن أن تؤثر الفئة الفرعية التي تمتد إلى فئة غير قابلة للتغيير على حالة الكائن. ولذلك، فإن الفصل هو النهائي .

4. النسخ الدفاعية

أثناء إنشاء الكائن، بدلاً من تعيين الوسائط من المُنشئ مباشرةً إلى الحقول الخاصة، فإن إنشاء نسخة عميقة (أو نسخة غير قابلة للتغيير) من الوسائط سيوفر تعديلًا خارجيًا. إذا كانت إحدى الوسائط عبارة عن نوع مرجعي، فيمكن التلاعب بها بسهولة من جانب المتصل. يتيح لك إنشاء نسخ واقية تجنب هذا التلاعب. وبالمثل، بالنسبة إلى أدوات الوصول (getters)، بدلاً من الإشارة مباشرةً إلى حقل داخلي، يمكن مشاركة نسخة منه بحرية.

تطبيق

موظف

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public final class Employee {

    private final long id;
    private final String name;
    private final LocalDate joinDate;
    private final List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public LocalDate getJoinDate() {
        return joinDate;
    }

    public List<String> getAchievements() {
        return achievements;
    }
}
  • لا تحتوي كافة الحقول على نسخ محمية في المُنشئ. وذلك لأن المعرف بدائي وأن حقول الاسم وتاريخ الانضمام هي أنواع غير قابلة للتغيير. لا يمكن للمتصل تغييرها وستظل دون تغيير، بينما يتطلب حقل الإنجازات نسخة من الوسيطة التي تم إنشاؤها باستخدام الأسلوب List.copyOf . وذلك لأن CopyOf يُرجع قائمة غير قابلة للتغيير .

  • وبالمثل، تقوم أساليب الوصول بإرجاع الحقول مباشرة بدلاً من النسخ الدفاعية لأن جميع أنواع الحقول غير قابلة للتغيير (بما في ذلك الإنجازات ) وبالتالي لا يمكن تعديلها خارج الفصل.

تحسينات

قبل جافا 16

يمكن تحسين تنفيذ الموظف باستخدام مكتبات مثل Lombok . وهذا يقلل من الإسهاب في الكود ويساعده على أن يبدو أكثر نظافة. تأتي المكتبة مع التعليقات التوضيحية لتقصير الكود القياسي. يمكن استخدام @Value (التعليق التوضيحي) لإنشاء حروف ومنشئ لجميع الوسائط. يؤدي هذا أيضًا إلى إنشاء فئة نهائية وحقول خاصة ونهائية . كملاحظة، فإنه يُنشئ أيضًا أساليب toString و equals و hashCode . يمكن إعادة كتابة تطبيق الموظف باستخدام @Value كما هو موضح أدناه:
import lombok.Value;

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

@Value
public class Employee {

    long id;
    String name;
    LocalDate joinDate;
    List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

جافا 16 والإصدارات الأحدث

قدم إصدار Java 16 وظيفة تسجيل جديدة . هذه (كما ذكر JEP) هي فئات تعمل كحاملات شفافة للبيانات غير القابلة للتغيير ويمكن اعتبارها صفوفًا اسمية. يمكن إعادة تنفيذ فئة الموظف كموظف سجل كما هو موضح أدناه.
import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public record Employee(long id,
                       String name,
                       LocalDate joinDate,
                       List<String> achievements) {

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

عيوب

المشكلة الوحيدة في عدم القابلية للتغيير هي الذاكرة الإضافية والمعالجة التي تتطلب تعديلًا صغيرًا. في كل مرة تحتاج إلى إنشاء كائن جديد، الأمر الذي قد يكون مكلفًا للغاية. للتغلب على هذا العيب، يمكنك تنفيذ آليات مثل التخزين المؤقت وحفظ النتائج.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION