JavaRush /Java blogi /Random-UZ /Kofe tanaffusi №121. Java-da Classpath nima va uni qanday...

Kofe tanaffusi №121. Java-da Classpath nima va uni qanday o'rnatish kerak? Java-da o'zgarmaslik

Guruhda nashr etilgan

Java-da Classpath nima va uni qanday o'rnatish kerak?

Manba: O'rta Dasturlash asoslarini va dastur fayllarini bajarish oqimini bilish tilni tushunishimizga yordam beradi. Classpath parametrini bilish har bir Java dasturchisi bilishi kerak bo'lgan asosiy tushunchalardan biridir. Bugun biz sinf yo'li ( Classpath ) nima ekanligini, uni qanday o'rnatishni va JVM ga sinf fayllarini bajarishda qanday yordam berishini muhokama qilamiz. Kofe tanaffusi №121.  Java-da Classpath nima va uni qanday o'rnatish kerak?  Java-da o'zgarmaslik - 1

Classpath nima?

Classpath Java tilidagi asosiy parametrlardan biridir, lekin uni dasturlashga yangi kelganlar ko'pincha noto'g'ri tushunadilar. Soddalashtirish uchun Classpath bu Java kompilyatori va JVM boshqa sinflarni kompilyatsiya qilish yoki bajarish uchun kerakli sinflarni topishi kerak bo'lgan yo'llar to'plamidir .

Classpath JVM ga sinf fayllarini bajarishda qanday yordam beradi

Keling, misol bilan boshlaylik. Faraz qilaylik, bizda /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java jildida joylashgan Main.java fayli bor .
package com.programming.v1;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello classpath");
    }
}
Aytaylik, biz /Users/vikram/Documents- damiz va ushbu sinfni kompilyatsiya qilmoqchimiz:
javac test-java/src/com/programming/v1/Main.java
Endi ushbu sinf faylini bajarish uchun Java Virtual mashinasiga classpath yoki java buyrug'idagi cp bayrog'i yordamida .class faylini qaerdan izlash kerakligini aytishimiz kerak .
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
Birinchi parametr - bu paket yozilgan ildiz papkasi. Ikkinchi parametr sinf nomi bilan paket nomi. Java buyrug'i bajarilganda, Java virtual mashinasi test-java/src papkasini ko'rib chiqadi va keyin uni bajarish uchun asosiy sinfni yuklaydi.

Classpath o'zgaruvchisini qanday o'rnatish kerak

Classpath o'zgaruvchisi Linux mashinalarida quyida ko'rsatilganidek o'rnatilishi mumkin:
export CLASSPATH="test-java/src"
Windows mashinasidagi Classpath muhit o'zgaruvchilari yordamida qo'shilishi/yangilanishi mumkin. Atrof-muhit o'zgaruvchisi o'rnatilgandan so'ng, java buyrug'i quyida ko'rsatilganidek bajarilishi mumkin:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Classpath haqida bilishingiz kerak bo'lgan hamma narsa shu . O'qiganingiz uchun tashakkur!

Java-da o'zgarmaslik

Manba: Java-da o'rta o'zgaruvchilar ikki xil: ibtidoiy va mos yozuvlar. Java-da hamma narsa qiymat bo'yicha uzatiladi, ammo mos yozuvlar turlari bo'lsa, manba ma'lumotlari o'tkazilgan xotira manzili yordamida yangilanishi mumkin. YakuniyKofe tanaffusi №121.  Java-da Classpath nima va uni qanday o'rnatish kerak?  Java-da o'zgarmaslik - 2 kalit so'z o'zgaruvchining doimiy rolini bajarishi, ya'ni qayta tayinlanishning oldini olish uchun ishlatiladi. Bu yig'ma xotiraga ega bo'lmagan primitivlar uchun yaxshi ishlaydi, mos yozuvlar turlari uchun faqat qayta tayinlash cheklangan va ichki holatni o'zgartirish mumkin. Bu ko'plab parallel muammolar va poyga sharoitlariga olib kelishi mumkin. Shunday qilib, Java-da oddiy turdagi o'zgarmas xususiyatlarni kiritish juda ko'p afzalliklarni beradi.

Java-da o'zgarmaslikning afzalliklari

1. Ipning xavfsizligi

O'zgarmas turlar ko'p tarmoqli muhitda poyga sharoitlariga immunitetga ega, chunki ob'ekt yaratilgandan keyin ham izchil bo'lib qoladi. Bir nechta iplar ichki holatini o'zgartira olmaydi, shuning uchun sinxronizatsiya talab qilinmaydi.

2. Asosiy tip

Java standart kutubxonasidagi string asosiy sinfning yaxshi namunasidir. Bu juda oddiy va o'zgarmas sinf bo'lib, uning ustiga biznes mantiqiy domenlarini yaratish uchun ishlatilishi mumkin. Xuddi shunday, o'zgarmas tur qurish uchun ajoyib tayanch turi sifatida harakat qilishi mumkin.

Xususiyatlari

1. Shaxsiy va Yakuniy maydonlar

Ob'ekt holatini o'z ichiga olgan maydonlar shaxsiy va yakuniydir . Shaxsiy ko'rinish maydonga to'g'ridan-to'g'ri kirishni oldini oladi, yakuniy ko'rinish esa maydon faqat bir marta tayinlanishini ta'minlaydi .

2. Modifikator usullari yo'q

Shaxsiy maydonga sinfdan tashqari kirish mumkin emas. Odatda, maydonlarni o'qish va yozish uchun mos ravishda kirish usullari (qabul qiluvchilar) va modifikator usullari (setterlar) taqdim etiladi. Muvofiqlikni ta'minlash uchun modifikatorlarga ruxsat berilmaydi.

3. Yakuniy sinf

Sinf merosiga ruxsat berish o'zgarmaslikni buzishi mumkin. O'zgarmas sinfni kengaytiruvchi kichik sinf ob'ekt holatiga ta'sir qilishi mumkin. Shunday qilib, sinf yakuniy hisoblanadi .

4. Himoya nusxalari

Ob'ektni yaratish jarayonida konstruktordan argumentlarni to'g'ridan-to'g'ri shaxsiy maydonlarga belgilash o'rniga, argumentlarning chuqur nusxasini (yoki o'zgarmas nusxasini) yaratish tashqi modifikatsiyani ta'minlaydi. Agar argumentlardan biri mos yozuvlar turi bo'lsa, uni chaqiruvchining oxirida osongina boshqarish mumkin. Himoya nusxalarini yaratish ushbu manipulyatsiyadan qochish imkonini beradi. Xuddi shunday, qo'shimchalar (qabul qiluvchilar) uchun ichki maydonga to'g'ridan-to'g'ri murojaat qilish o'rniga, uning nusxasi erkin bo'lishi mumkin.

Amalga oshirish

Xodim

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;
    }
}
  • Barcha maydonlarda konstruktorda himoya nusxalari mavjud emas. Buning sababi, id ibtidoiy va nom va joinDate maydonlari o'zgarmas turlardir. Ular qo'ng'iroq qiluvchi tomonidan o'zgartirilmaydi va o'zgarishsiz qoladi, yutuqlar maydoni esa List.copyOf usuli yordamida qilingan argumentning nusxasini talab qiladi . Buning sababi, copyOf o'zgarmas ro'yxatni qaytaradi .

  • Xuddi shunday, yordamchi usullar himoya nusxalarini emas, to'g'ridan-to'g'ri maydonlarni qaytaradi, chunki barcha maydon turlari o'zgarmas (jumladan, yutuqlar ) va shuning uchun sinfdan tashqarida o'zgartirilmaydi.

Yaxshilanishlar

Java 16 dan oldin

Xodimlarni amalga oshirish Lombok kabi kutubxonalar bilan yaxshilanishi mumkin . Bu koddagi batafsil ma'lumotni kamaytiradi va uni yanada toza ko'rinishga yordam beradi. Kutubxona standart kodni qisqartirish uchun izohlar bilan birga keladi. @Value (annotatsiya) barcha argumentlar uchun oluvchilar va konstruktor yaratish uchun ishlatilishi mumkin. Bu shuningdek, yakuniy sinf va xususiy va yakuniy maydonlarni yaratadi . Eslatma sifatida u toString , equals va hashCode usullarini ham yaratadi . Xodimning ilovasi quyida ko'rsatilganidek @Value yordamida qayta yozilishi mumkin :
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 va undan keyingi versiyalar

Java 16 versiyasi yangi Record funksiyasini taqdim etdi . Bular (JEP tomonidan ta'kidlanganidek) o'zgarmas ma'lumotlarning shaffof tashuvchisi sifatida ishlaydigan sinflardir va ularni nominal kortejlar deb hisoblash mumkin. Xodimlar sinfi quyida ko'rsatilganidek, rekord Xodim sifatida qayta qo'llanilishi mumkin .
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);
    }
}

Kamchiliklar

O'zgarmaslik bilan bog'liq yagona muammo - bu qo'shimcha xotira va ishlov berish, hatto kichik o'zgartirish ham talab qiladi. Har safar siz yangi ob'ektni yaratishingiz kerak, bu juda qimmatga tushishi mumkin. Ushbu kamchilikni bartaraf etish uchun siz keshlash va natijalarni saqlash kabi mexanizmlarni qo'llashingiz mumkin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION