JavaRush /Java Blogu /Random-AZ /Kofe fasiləsi №121. Java-da Classpath nədir və onu necə q...

Kofe fasiləsi №121. Java-da Classpath nədir və onu necə quraşdırmaq olar? Java-da dəyişməzlik

Qrupda dərc edilmişdir

Java-da Classpath nədir və onu necə quraşdırmaq olar?

Mənbə: Orta Proqramlaşdırmanın əsaslarını və proqram fayllarının icra axınını bilmək bizə dili başa düşməyə kömək edir. Classpath parametrini bilmək hər bir Java tərtibatçısının bilməli olduğu əsas anlayışlardan biridir. Bu gün biz sinif yolunun ( Sınıf yolu ) nə olduğunu, onun necə qurulacağını və JVM-ə sinif fayllarını icra etməyə necə kömək edəcəyini müzakirə edəcəyik. Kofe fasiləsi №121.  Java-da Classpath nədir və onu necə quraşdırmaq olar?  Java-da dəyişməzlik - 1

Classpath nədir?

Classpath Java-da əsas parametrlərdən biridir, lakin proqramlaşdırmaya yeni gələnlər tərəfindən çox vaxt səhv başa düşülür. Sadələşdirmək üçün Classpath sadəcə olaraq Java tərtibçisi və JVM-nin digər sinifləri tərtib etmək və ya icra etmək üçün lazımi sinifləri tapmalı olduğu yollar toplusudur .

Classpath sinif fayllarını icra etməkdə JVM-ə necə kömək edir

Bir nümunə ilə başlayaq. Fərz edək ki, /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java qovluğunda yerləşən Main.java faylımız var .
package com.programming.v1;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello classpath");
    }
}
Tutaq ki, biz /Users/vikram/Documents bölməsindəyik və bu sinfi tərtib etmək istəyirik:
javac test-java/src/com/programming/v1/Main.java
İndi bu sinif faylını yerinə yetirmək üçün Java Virtual Maşınına classpath və ya java əmrində cp bayrağından istifadə edərək .class faylını harada axtarmaq lazım olduğunu söyləməliyik .
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
Birinci parametr paketin yazıldığı kök qovluqdur. İkinci parametr sinif adı ilə paket adıdır. Java əmri yerinə yetirildikdə, Java Virtual Maşın test-java/src qovluğuna baxır və sonra onu yerinə yetirmək üçün əsas sinfi yükləyir.

Classpath dəyişənini necə təyin etmək olar

Classpath dəyişəni Linux maşınlarında aşağıda göstərildiyi kimi təyin edilə bilər:
export CLASSPATH="test-java/src"
Windows maşınında sinif yolu mühit dəyişənlərindən istifadə etməklə əlavə edilə/yenilənə bilər. Ətraf dəyişəni təyin edildikdən sonra java əmri aşağıda göstərildiyi kimi icra edilə bilər:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Classpath haqqında bilmək üçün bütün bunlardır . Oxuduğunuz üçün təşəkkür edirik!

Java-da dəyişməzlik

Mənbə: Java-da Orta Dəyişənlər iki növdür: primitiv və istinad. Java-da hər şey dəyərlə ötürülür, lakin istinad növləri halında, mənbə məlumatları ötürülən yaddaş ünvanından istifadə etməklə yenilənə bilər. Dəyişənin sabit kimi fəaliyyət göstərməsi, yəni yenidən təyinatın qarşısını almaq üçün yekunKofe fasiləsi №121.  Java-da Classpath nədir və onu necə quraşdırmaq olar?  Java-da dəyişməzlik - 2 açar sözdən istifadə olunur. Bu, yığın yaddaşı olmayan primitivlər üçün yaxşı işləyir, halbuki istinad növləri üçün yalnız yenidən təyinat məhduddur və daxili vəziyyət dəyişdirilə bilər. Bu, bir çox paralellik problemlərinə və yarış şərtlərinə səbəb ola bilər. Beləliklə, Java-da müntəzəm tipdə dəyişməz xüsusiyyətlərin daxil edilməsi bir çox üstünlüklər təmin edir.

Java-da Dəyişməzliyin Faydaları

1. İpin təhlükəsizliyi

Dəyişməz növlər çox yivli mühitdə yarış şərtlərinə qarşı immunitetlidir, çünki obyekt yaradıldıqdan sonra ardıcıl olaraq qalacaq. Birdən çox başlıq daxili vəziyyətini dəyişə bilməz, buna görə sinxronizasiya tələb olunmur.

2. Əsas tip

Java Standart Kitabxanasındakı sətir əsas sinifin yaxşı nümunəsidir. Bu, üzərində biznes məntiqi domenləri qurmaq üçün istifadə edilə bilən çox sadə və dəyişməz sinifdir. Eynilə, dəyişməz bir növ qurmaq üçün əla əsas növü kimi çıxış edə bilər.

Xüsusiyyətlər

1. Şəxsi və Yekun sahələr

Obyektin vəziyyətini ehtiva edən sahələr özəlyekundur . Şəxsi görünmə sahəyə birbaşa girişin qarşısını alır, son görünmə isə sahənin yalnız bir dəfə təyin olunmasını təmin edir .

2. Modifikator üsulları yoxdur

Şəxsi sahəyə sinifdən kənar daxil olmaq mümkün deyil. Tipik olaraq, sahələri oxumaq və yazmaq üçün müvafiq olaraq giriş metodları (alıcılar) və dəyişdirici üsullar (setterlər) təmin edilir. Ardıcıllığı təmin etmək üçün dəyişdiricilərə icazə verilmir.

3. Yekun sinif

Sinif varisliyinə icazə vermək dəyişməzliyi poza bilər. Dəyişməz sinfi genişləndirən alt sinif obyektin vəziyyətinə təsir göstərə bilər. Beləliklə, sinif sondur .

4. Müdafiə nüsxələri

Obyektin yaradılması zamanı konstruktordan arqumentləri birbaşa özəl sahələrə təyin etmək əvəzinə, arqumentlərin dərin surətinin (və ya dəyişməz surətinin) yaradılması xarici modifikasiyanı təmin edəcəkdir. Arqumentlərdən biri istinad növüdürsə, zəng edənin sonunda asanlıqla manipulyasiya edilə bilər. Qoruyucu nüsxələrin yaradılması bu manipulyasiyadan qaçmağa imkan verir. Eynilə, daxil olanlar (alıcılar) üçün daxili sahəyə birbaşa istinad etmək əvəzinə, onun surəti sərbəst şəkildə paylaşıla bilər.

İcra

işçi

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;
    }
}
  • Bütün sahələrin konstruktorda qoruyucu nüsxələri yoxdur. Bunun səbəbi, id-nin primitiv olması və adqoşulma tarixi sahələrinin dəyişməz növlər olmasıdır. Onlar zəng edən tərəfindən dəyişdirilə bilməz və dəyişməz qalacaq, halbuki nailiyyətlər sahəsi List.copyOf metodundan istifadə edərək edilən arqumentin surətini tələb edir . Bunun səbəbi copyOf-un dəyişməz Siyahı qaytarmasıdır .

  • Eyni şəkildə, giriş metodları müdafiə nüsxələri deyil, birbaşa sahələri qaytarır, çünki bütün sahə növləri dəyişməzdir ( nailiyyətlər daxil olmaqla ) və buna görə də sinifdən kənarda dəyişdirilə bilməz.

Təkmilləşdirmələr

Java 16-dan əvvəl

İşçinin tətbiqi Lombok kimi kitabxanalarla təkmilləşdirilə bilər . Bu, koddakı təfərrüatları azaldır və onun daha təmiz görünməsinə kömək edir. Kitabxana standart kodu qısaltmaq üçün qeydlərlə gəlir. @Value (annotasiya) bütün arqumentlər üçün alıcılar və konstruktor yaratmaq üçün istifadə edilə bilər. Bu həm də son sinif və özəlyekun sahələr yaradır . Qeyd olaraq, o, həmçinin toString , equalshashCode üsullarını yaradır . İşçi tətbiqi aşağıda göstərildiyi kimi @Value istifadə edərək yenidən yazıla bilər :
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);
    }
}

Java 16 və daha sonra

Java 16 buraxılışı yeni Record funksiyasını təqdim etdi . Bunlar (JEP tərəfindən bildirildiyi kimi) dəyişməz məlumatların şəffaf daşıyıcısı kimi çıxış edən siniflərdir və nominal dəstlər kimi düşünülə bilər. İşçi sinfi aşağıda göstərildiyi kimi rekord İşçi kimi yenidən tətbiq oluna bilər .
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);
    }
}

Qüsurlar

Dəyişməzliklə bağlı yeganə problem, hətta kiçik modifikasiyanın da tələb etdiyi əlavə yaddaş və emaldır. Hər dəfə çox bahalı ola biləcək yeni bir obyekt yaratmaq lazımdır. Bu çatışmazlığı aradan qaldırmaq üçün keşləmə və nəticələrin saxlanması kimi mexanizmləri tətbiq edə bilərsiniz.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION