JavaRush /وبلاگ جاوا /Random-FA /کافه استراحت شماره 121. Classpath در جاوا چیست و چگونه آن...

کافه استراحت شماره 121. Classpath در جاوا چیست و چگونه آن را نصب کنیم؟ تغییر ناپذیری در جاوا

در گروه منتشر شد

Classpath در جاوا چیست و چگونه آن را نصب کنیم؟

منبع: Medium دانستن اصول برنامه نویسی و جریان اجرای فایل های برنامه به ما در درک یک زبان کمک می کند. دانستن پارامتر Classpath یکی از مفاهیم اساسی است که هر توسعه دهنده جاوا باید بداند. امروز بحث خواهیم کرد که مسیر کلاس ( Classpath ) چیست، چگونه آن را تنظیم کنیم و چگونه به JVM در اجرای فایل های کلاس کمک می کند. Кофе-брейк #121. What такое Classpath в Java и How его установить? Неизменяемость в Java - 1

Classpath چیست؟

Classpath یکی از پارامترهای اصلی در جاوا است، اما اغلب توسط تازه واردان برنامه نویسی اشتباه می شود. برای ساده تر، Classpath به سادگی مجموعه ای از مسیرها است که کامپایلر جاوا و 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
حال برای اجرای این فایل کلاس، باید به ماشین مجازی جاوا بگوییم که کجا باید فایل .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
اولین پارامتر پوشه ریشه ای است که بسته در آن نوشته شده است. پارامتر دوم نام بسته با نام کلاس است. هنگامی که یک دستور جاوا اجرا می شود، ماشین مجازی جاوا در پوشه test-java/src نگاه می کند و سپس کلاس اصلی را بارگذاری می کند تا آن را اجرا کند.

نحوه تنظیم متغیر Classpath

متغیر Classpath را می توان مطابق شکل زیر در ماشین های لینوکس تنظیم کرد:
export CLASSPATH="test-java/src"
Classpath در یک ماشین ویندوز می تواند با استفاده از متغیرهای محیطی اضافه یا به روز شود. هنگامی که متغیر محیطی تنظیم شد، دستور جاوا را می توان مطابق شکل زیر اجرا کرد:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
این تمام چیزی است که درباره Classpath باید بدانید . ممنون که خواندید!

تغییر ناپذیری در جاوا

منبع: متغیرهای متوسط ​​در جاوا دو نوع هستند: اولیه و مرجع. همه چیز در جاوا با مقدار ارسال می شود، اما در مورد انواع مرجع، داده های منبع را می توان با استفاده از آدرس حافظه ارسال شده به روز کرد. Кофе-брейк #121. What такое Classpath в Java и How его установить? Неизменяемость в Java - 2کلمه کلیدی نهایی برای اینکه متغیر به عنوان یک ثابت عمل کند، یعنی اجتناب از تخصیص مجدد استفاده می شود. این برای نمونه های اولیه که حافظه پشته ای ندارند به خوبی کار می کند، در حالی که برای انواع مرجع فقط تخصیص مجدد محدود است و حالت داخلی را می توان تغییر داد. این می تواند به بسیاری از مسائل همزمان و شرایط مسابقه منجر شود. بنابراین، گنجاندن ویژگی های تغییرناپذیر در یک نوع معمولی در جاوا، مزایای بسیاری را به همراه دارد.

مزایای تغییرناپذیری در جاوا

1. ایمنی نخ

انواع تغییرناپذیر نسبت به شرایط مسابقه در یک محیط چند رشته ای مصون هستند زیرا شی پس از ایجاد آن ثابت می ماند. چندین رشته نمی توانند حالت داخلی خود را تغییر دهند، بنابراین نیازی به همگام سازی نیست.

2. نوع بنیادی

رشته در کتابخانه استاندارد جاوا مثال خوبی از کلاس پایه است. این یک کلاس بسیار ساده و تغییرناپذیر است که می توان از آن برای ساخت دامنه های منطق تجاری در بالای آن استفاده کرد. به همین ترتیب، یک نوع تغییرناپذیر می تواند به عنوان یک نوع پایه عالی عمل کند که بر روی آن ساخته شود.

مشخصات

1. فیلدهای خصوصی و نهایی

فیلدهایی که شامل حالت یک شی هستند خصوصی و نهایی هستند . دید خصوصی از دسترسی مستقیم به فیلد جلوگیری می کند، در حالی که دید نهایی تضمین می کند که میدان فقط یک بار اختصاص داده شود.

2. روش های اصلاح کننده وجود ندارد

فیلد خصوصی خارج از کلاس قابل دسترسی نیست. معمولاً روش‌های دسترسی (گیرنده‌ها) و روش‌های اصلاح‌کننده (تنظیم‌کننده‌ها) به ترتیب برای خواندن و نوشتن در فیلدها ارائه می‌شوند. برای اطمینان از سازگاری، اصلاح کننده ها مجاز نیستند.

3. کلاس پایانی

اجازه دادن به ارث بری کلاس ممکن است تغییر ناپذیری را از بین ببرد. یک زیر کلاس که یک کلاس تغییرناپذیر را گسترش می دهد می تواند وضعیت یک شی را تحت تأثیر قرار دهد. بنابراین کلاس نهایی است .

4. نسخه های دفاعی

در حین ایجاد شی، به جای اختصاص آرگومان‌های سازنده مستقیماً به فیلدهای خصوصی، ایجاد یک کپی عمیق (یا کپی غیرقابل تغییر) از آرگومان‌ها، تغییرات خارجی را ایجاد می‌کند. اگر یکی از آرگومان ها از نوع مرجع باشد، می توان آن را به راحتی در انتهای تماس گیرنده دستکاری کرد. ایجاد نسخه های محافظ به شما امکان می دهد از این دستکاری جلوگیری کنید. به طور مشابه، برای دسترسی‌ها (گیرنده‌ها)، به جای ارجاع مستقیم به یک فیلد داخلی، می‌توان یک کپی از آن را آزادانه به اشتراک گذاشت.

پیاده سازی

کارمند

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;
    }
}
  • همه فیلدها دارای نسخه های محافظ در سازنده نیستند. دلیلش این است که id اولیه است و فیلدهای نام و joinDate از انواع غیرقابل تغییر هستند. آنها را نمی توان توسط تماس گیرنده تغییر داد و بدون تغییر باقی خواهند ماند، در حالی که فیلد دستاوردها به یک کپی از آرگومان ساخته شده با استفاده از روش List.copyOf نیاز دارد . این به این دلیل است که copyOf یک لیست غیرقابل تغییر را برمی گرداند .

  • به همین ترتیب، متدهای دسترسی، فیلدها را مستقیماً به جای کپی‌های دفاعی برمی‌گردانند، زیرا همه انواع فیلدها تغییرناپذیر هستند (از جمله دستاوردها ) و بنابراین نمی‌توان آنها را خارج از کلاس تغییر داد.

بهبودها

قبل از جاوا 16

پیاده سازی Employee را می توان با کتابخانه هایی مانند Lombok بهبود بخشید . این باعث کاهش پرحرفی کد می شود و به تمیزتر به نظر رسیدن آن کمک می کند. این کتابخانه همراه با حاشیه نویسی برای کوتاه کردن کد استاندارد است. @Value (annotation) می تواند برای ایجاد گیرنده و سازنده برای همه آرگومان ها استفاده شود. این همچنین یک کلاس نهایی و فیلدهای خصوصی و نهایی ایجاد می کند . به عنوان یک نکته، متدهای toString ، برابری و hashCode را نیز تولید می کند . پیاده سازی Employee را می توان با استفاده از @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 به بعد

نسخه جاوا 16 یک تابع ضبط جدید را معرفی کرد . اینها (همانطور که توسط JEP بیان شد) کلاس هایی هستند که به عنوان حامل های شفاف داده های تغییرناپذیر عمل می کنند و می توانند به عنوان تاپل های اسمی در نظر گرفته شوند. طبق شکل زیر می توان کلاس Employee را به عنوان رکورد Employee پیاده سازی کرد .
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