Ano ang Classpath sa Java at paano ito i-install?
Pinagmulan: Medium Ang pag-alam sa mga pangunahing kaalaman sa programming at ang daloy ng pagpapatupad ng mga file ng programa ay nakakatulong sa amin na maunawaan ang isang wika. Ang pag-alam sa parameter ng Classpath ay isa sa mga pangunahing konsepto na dapat malaman ng bawat developer ng Java. Ngayon ay tatalakayin natin kung ano ang path ng klase ( Classpath ), kung paano ito itakda, at kung paano ito nakakatulong sa JVM na magsagawa ng mga file ng klase.![Кофе-брейк #121. What такое Classpath в Java и How его установить? Неизменяемость в Java - 1](https://cdn.javarush.com/images/article/1bae37cd-589f-4c8b-8e52-5cf7df498bfa/800.jpeg)
Ano ang Classpath?
Ang Classpath ay isa sa mga pangunahing parameter sa Java, ngunit madalas itong hindi maunawaan ng mga bagong dating sa programming. Upang pasimplehin, ang isang Classpath ay isang hanay lamang ng mga landas kung saan dapat mahanap ng Java compiler at JVM ang mga kinakailangang klase upang mag-compile o magsagawa ng iba pang mga klase.Paano tinutulungan ng Classpath ang JVM sa pagpapatupad ng mga file ng klase
Magsimula tayo sa isang halimbawa. Ipagpalagay natin na mayroon tayong Main.java file na matatagpuan sa /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java folder .package com.programming.v1;
public class Main {
public static void main(String[] args) {
System.out.println("Hello classpath");
}
}
Sabihin nating nasa /Users/vikram/Documents tayo at gustong i-compile ang klase na ito:
javac test-java/src/com/programming/v1/Main.java
Ngayon, para maisagawa ang class file na ito, kailangan nating sabihin sa Java Virtual Machine kung saan hahanapin ang .class file gamit ang classpath o ang cp flag sa java command .
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
Ang unang parameter ay ang root folder kung saan nakasulat ang package. Ang pangalawang parameter ay ang pangalan ng package na may pangalan ng klase. Kapag ang isang Java command ay naisakatuparan, ang Java Virtual Machine ay tumitingin sa test-java/src na folder at pagkatapos ay nilo-load ang pangunahing klase upang maisagawa ito.
Paano magtakda ng variable ng Classpath
Maaaring itakda ang variable ng Classpath tulad ng ipinapakita sa ibaba sa mga makina ng Linux:export CLASSPATH="test-java/src"
Ang Classpath sa isang Windows machine ay maaaring idagdag/i-update gamit ang mga variable ng kapaligiran. Kapag naitakda na ang environment variable, ang java command ay maaaring isagawa tulad ng ipinapakita sa ibaba:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Iyon lang ang dapat malaman tungkol sa Classpath . Salamat sa pagbabasa!
Kawalang pagbabago sa Java
Источник: Medium Переменные в Java бывают двух типов: примитивные и ссылочные. Все в Java передается по значению, но в случае ссылочных типов исходные данные могут обновляться с использованием переданного address памяти.![Кофе-брейк #121. What такое Classpath в Java и How его установить? Неизменяемость в Java - 2](https://cdn.javarush.com/images/article/80e209e7-a34c-4125-ba4f-e2dc759963f7/800.jpeg)
Преимущества неизменяемости в Java
1. Безопасность потоков
Неизменяемые типы невосприимчивы к условиям гонки в многопоточной среде, поскольку an object останется согласованным после его создания. Несколько потоков не могут изменить свое внутреннее состояние, поэтому синхронизация не требуется.2. Основополагающий тип
String в стандартной библиотеке Java — хороший пример базового класса. Это очень простой и неизменяемый класс, который можно использовать для создания доменов бизнес-логики поверх него. Точно так же неизменяемый тип может выступать в качестве отличного базового типа, на основе которого можно строить.Характеристики
1. Поля Private и Final
Поля, содержащие состояние an object, — это private и final. Частная (private) видимость запрещает прямой доступ к полю, а окончательная (final) гарантирует, что поле назначается только один раз.2. НиHowих методов-модификаторов
К полю private нельзя получить доступ за пределами класса. Обычно для чтения и записи в поля предусмотрены методы доступа (геттеры) и методы-модификаторы (сеттеры) соответственно. Для обеспечения неизменности модификаторы не допускаются.3. Класс Final
Предоставление возможности наследования класса может нарушить неизменяемость. Подкласс, расширяющий неизменяемый класс, может повлиять на состояние an object. Следовательно, класс является окончательным (final).4. Защитные копии (Defensive Copies)
Во время создания an object instead of того, чтобы назначать аргументы из конструктора непосредственно закрытым полям, создание глубокой копии (or неизменяемой копии) аргументов обеспечит внешнее изменение. Если один из аргументов является ссылочным типом, им можно легко манипулировать на вызывающей стороне. Creation защитных копий позволяет избежать этой манипуляции. Точно так же для средств доступа (геттеров) instead of прямой ссылки на внутреннее поле можно свободно делиться его копией.Реализация
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 являются неизменяемыми типами. Они не могут быть изменены вызывающей стороной и останутся неизменными, в то время How поле achievements требует копии аргумента, сделанного с помощью метода List.copyOf. Это объясняется тем, что copyOf возвращает неизменяемый List.
-
Точно так же методы доступа возвращают поля напрямую, а не защитные копии, потому что все типы полей являются неизменяемыми (включая achievements) и, следовательно, не могут быть изменены вне класса.
Улучшения
До Java 16
Реализация Employee может быть улучшена с помощью таких библиотек, How Lombok. Это уменьшает многословие в codeе и помогает ему выглядеть более чистым. Библиотека поставляется с annotationми для сокращения стандартного codeа. @Value (annotation) может использоваться для создания геттеров и конструктора всех аргументов. Это также создает класс final и поля private и final. В качестве примечания, он также генерирует методы toString, equals и hashCode. Реализация Employee может быть переписана с помощью @Value, How показано ниже: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. Она (How утверждает JEP) является классами, которые действуют How прозрачные носители неизменяемых данных и могут рассматриваться How номинальные кортежи (tuples). Класс Employee можно повторно реализовать How 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);
}
}
GO TO FULL VERSION