Classpath trong Java là gì và cách cài đặt nó như thế nào?
Nguồn: Medium Biết những điều cơ bản về lập trình và luồng thực thi của tệp chương trình giúp chúng ta hiểu một ngôn ngữ. Biết tham số Classpath là một trong những khái niệm cơ bản mà mọi nhà phát triển Java nên biết. Hôm nay chúng ta sẽ thảo luận về đường dẫn lớp ( Classpath ) là gì, cách thiết lập nó và cách nó giúp JVM thực thi các tệp lớp.Đường dẫn lớp là gì?
Classpath là một trong những tham số cơ bản trong Java nhưng nó thường bị những người mới làm quen với lập trình hiểu nhầm. Để đơn giản hóa, Classpath chỉ đơn giản là một tập hợp các đường dẫn mà trình biên dịch Java và JVM phải tìm các lớp cần thiết để biên dịch hoặc thực thi các lớp khác.Cách Classpath giúp JVM thực thi các tệp lớp
Hãy bắt đầu với một ví dụ. Giả sử chúng ta có tệp Main.java nằm trong thư mục /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");
}
}
Giả sử chúng ta đang ở trong /Users/vikram/Documents và muốn biên dịch lớp này:
javac test-java/src/com/programming/v1/Main.java
Bây giờ, để thực thi tệp lớp này, chúng ta cần cho Máy ảo Java biết nơi tìm tệp .class bằng đường dẫn lớp hoặc cờ cp trong lệnh 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
Tham số đầu tiên là thư mục gốc nơi gói được viết. Tham số thứ hai là tên gói với tên lớp. Khi một lệnh Java được thực thi, Máy ảo Java sẽ tìm trong thư mục test-java/src rồi tải lớp chính để thực thi lệnh đó.
Cách đặt biến Classpath
Biến Classpath có thể được đặt như hiển thị bên dưới trên các máy Linux:export CLASSPATH="test-java/src"
Đường dẫn lớp trên máy Windows có thể được thêm/cập nhật bằng các biến môi trường. Khi biến môi trường được đặt, lệnh java có thể được thực thi như dưới đây:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Đó là tất cả những gì cần biết về Classpath . Cảm ơn bạn đã đọc!
Tính bất biến trong Java
Nguồn: Biến trung bình trong Java có hai loại: nguyên thủy và tham chiếu. Mọi thứ trong Java đều được truyền theo giá trị, nhưng trong trường hợp kiểu tham chiếu, dữ liệu nguồn có thể được cập nhật bằng địa chỉ bộ nhớ đã truyền. Từ khóa cuối cùng được sử dụng để làm cho biến hoạt động như một hằng số, nghĩa là tránh việc gán lại. Điều này hoạt động tốt đối với các kiểu nguyên thủy không có bộ nhớ heap, trong khi đối với các kiểu tham chiếu, chỉ có việc gán lại bị hạn chế và trạng thái bên trong có thể được thay đổi. Điều này có thể dẫn đến nhiều vấn đề tương tranh và điều kiện chạy đua. Do đó, việc đưa các đặc điểm bất biến vào một kiểu thông thường trong Java mang lại nhiều lợi ích.Lợi ích của tính bất biến trong Java
1. An toàn chỉ
Các loại bất biến không bị ảnh hưởng bởi các điều kiện chủng tộc trong môi trường đa luồng vì đối tượng sẽ vẫn nhất quán sau khi được tạo. Nhiều luồng không thể thay đổi trạng thái bên trong của chúng, do đó không cần phải đồng bộ hóa.2. Loại cơ bản
Chuỗi trong Thư viện chuẩn Java là một ví dụ điển hình về lớp cơ sở. Đây là một lớp rất đơn giản và bất biến, có thể được sử dụng để xây dựng các miền logic nghiệp vụ trên đó. Tương tự như vậy, một loại bất biến có thể hoạt động như một loại cơ sở tuyệt vời để xây dựng.Đặc trưng
1. Trường riêng tư và trường cuối cùng
Các trường chứa trạng thái của một đối tượng là riêng tư và cuối cùng . Khả năng hiển thị riêng tư ngăn chặn quyền truy cập trực tiếp vào trường, trong khi khả năng hiển thị cuối cùng đảm bảo rằng trường chỉ được chỉ định một lần.2. Không có phương pháp sửa đổi
Trường riêng không thể được truy cập bên ngoài lớp. Thông thường, các phương thức truy cập (getters) và phương thức sửa đổi (setters) tương ứng được cung cấp để đọc và ghi vào các trường. Để đảm bảo tính nhất quán, không được phép sửa đổi.3. Lớp cuối cùng
Cho phép kế thừa lớp có thể phá vỡ tính bất biến. Một lớp con mở rộng một lớp bất biến có thể ảnh hưởng đến trạng thái của một đối tượng. Vì vậy, lớp học là cuối cùng .4. Bản sao phòng thủ
Trong quá trình tạo đối tượng, thay vì gán trực tiếp các đối số từ hàm tạo cho các trường riêng tư, việc tạo một bản sao sâu (hoặc bản sao bất biến) của các đối số sẽ cung cấp sửa đổi bên ngoài. Nếu một trong các đối số là loại tham chiếu, nó có thể dễ dàng được thao tác ở phía người gọi. Tạo bản sao bảo vệ cho phép bạn tránh thao tác này. Tương tự, đối với người truy cập (getters), thay vì tham chiếu trực tiếp đến trường nội bộ, bản sao của trường đó có thể được chia sẻ miễn phí.Thực hiện
Người lao động
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;
}
}
-
Không phải tất cả các trường đều có bản sao bảo vệ trong hàm tạo. Điều này là do id là nguyên thủy còn các trường name và joinDate là các loại không thể thay đổi. Người gọi không thể thay đổi chúng và sẽ không thay đổi, trong khi trường thành tích yêu cầu một bản sao của đối số được thực hiện bằng phương thức List.copyOf . Điều này là do copyOf trả về một List không thể thay đổi .
-
Tương tự, các phương thức truy cập trả về các trường trực tiếp thay vì các bản sao phòng thủ vì tất cả các loại trường đều không thay đổi (bao gồm cả thành tích ) và do đó không thể sửa đổi bên ngoài lớp.
Cải tiến
Trước Java 16
Việc triển khai Nhân viên có thể được cải thiện bằng các thư viện như Lombok . Điều này làm giảm tính dài dòng trong mã và giúp mã trông rõ ràng hơn. Thư viện đi kèm với các chú thích để rút ngắn mã tiêu chuẩn. @Value (chú thích) có thể được sử dụng để tạo getters và hàm tạo cho tất cả các đối số. Điều này cũng tạo ra một lớp cuối cùng và các trường riêng tư và cuối cùng . Xin lưu ý, nó cũng tạo ra các phương thức toString , Equals và hashCode . Việc triển khai Nhân viên có thể được viết lại bằng cách sử dụng @Value như dưới đây: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 trở lên
Bản phát hành Java 16 đã giới thiệu một hàm Record mới . Chúng (như JEP đã nêu) là các lớp đóng vai trò là vật mang dữ liệu bất biến trong suốt và có thể được coi là các bộ dữ liệu danh nghĩa. Lớp Nhân viên có thể được triển khai lại dưới dạng bản ghi Nhân viên như dưới đây.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