JavaRush /Java блог /Random UA /Кава-брейк #121. Що таке Classpath у Java та як його вста...

Кава-брейк #121. Що таке Classpath у Java та як його встановити? Незмінність у Java

Стаття з групи Random UA

Що таке Classpath у Java та як його встановити?

Джерело: Medium Знання основ програмування та потоку виконання програмних файлів допомагає нам зрозуміти мову. Знання параметра Classpath - одне з основних понять, яким повинен мати кожен Java-розробник. Сьогодні ми обговоримо, що таке шлях до класів ( Classpath ), як його встановити та як він допомагає JVM виконувати файли класів. Кава-брейк #121.  Що таке Classpath у Java та як його встановити?  Незмінність у Java - 1

Що таке Classpath?

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, де шукати файл .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 переглядає папку 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

Джерело: Medium Змінні в Java бувають двох типів: примітивні та посилальні. Все Java передається за значенням, але у випадку посилальних типів вихідні дані можуть оновлюватися з використанням переданої адресаи пам'яті. Кава-брейк #121.  Що таке Classpath у Java та як його встановити?  Незмінність Java - 2Ключове слово final використовується у тому, щоб змінна діяла як константа, тобто уникала перепризначення. Це добре працює для примітивів, у яких немає пам'яті в купі, тоді як для типів посилань обмежене тільки перепризначення, а внутрішній стан може бути змінено. Це може призвести до багатьох проблем з паралелізмом та умовами гонки (race conditions). Таким чином включення незмінних характеристик у звичайний тип Java дає багато переваг.

Переваги незмінності Java

1. Безпека потоків

Незмінні типи несприйнятливі до умов гонки у багатопотоковій середовищі, оскільки об'єкт залишиться узгодженим після створення. Декілька потоків не можуть змінити свій внутрішній стан, тому синхронізація не потрібна.

2. Основний тип

String у стандартній бібліотеці Java – гарний приклад базового класу. Це дуже простий і незмінний клас, який можна використовувати для створення доменів бізнес-логіки поверх нього. Точно так само незмінний тип може виступати як відмінний базовий тип, на основі якого можна будувати.

Характеристики

1. Поля Private та Final

Поля, що містять стан об'єкта, це private і final . Приватна ( private ) видимість забороняє прямий доступ до поля, а остаточна ( final ) гарантує, що поле призначається лише один раз.

2. Жодних методів-модифікаторів

До поля private не можна отримати доступ за межами класу. Зазвичай для читання та запису в поля передбачені методи доступу (гетери) та методи-модифікатори (сеттери) відповідно. Для забезпечення незмінності модифікатори не допускаються.

3. Клас Final

Надання можливості успадкування класу може порушити незмінність. Підклас, що розширює незмінний клас, може вплинути стан об'єкта. Отже, клас є остаточним ( final ).

4. Захисні копії (Defensive Copies)

Під час створення об'єкта замість того, щоб призначати аргументи з конструктора безпосередньо закритим полям, створення глибокої копії (або незмінної копії) аргументів забезпечить зовнішню зміну. Якщо один з аргументів є типом посилання, ним можна легко маніпулювати на зухвалій стороні. Створення захисних копій дозволяє уникнути цієї маніпуляції. Так само для засобів доступу (гетерів) замість прямого посилання на внутрішнє поле можна вільно ділитися його копією.

Реалізація

Employee

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 є примітивним, а поля name і joinDate є незмінними типами. Вони не можуть бути змінені стороною, що викликає, і залишаться незмінними, в той час як поле achievements вимагає копії аргументу, зробленого за допомогою методу List.copyOf . Це пояснюється тим, що copyOf повертає незмінний List .

  • Так само методи доступу повертають поля безпосередньо, а не захисні копії, тому що всі типи полів є незмінними (включаючи achievements ) і, отже, не можуть бути змінені поза класом.

Поліпшення

До Java 16

Реалізація Employee може бути покращена за допомогою таких бібліотек, як Lombok . Це зменшує багатослівність у коді та допомагає йому виглядати чистішим. Бібліотека постачається з інструкціями для скорочення стандартного коду. @Value (анотація) може використовуватися для створення гетерів та конструктора всіх аргументів. Це також створює клас final та поля private та final . Як примітка, він також генерує методи toString , equals і 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);
    }
}

Java 16 і пізніші версії

У релізі Java 16 з'явилася нова функція Record . Вона (як стверджує JEP) є класами, які діють як прозорі носії незмінних даних, і можуть розглядатися як номінальні кортежі (tuples). Клас Employee можна повторно реалізувати як record 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);
    }
}

Недоліки

Єдина проблема з незмінністю - додаткова пам'ять та обробка, які потрібні навіть для невеликої модифікації. Щоразу необхідно створювати новий об'єкт, що може бути дуже дорогим. Щоб обійти цей недолік, можна реалізувати такі механізми, як кешування та збереження результатів.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ