JavaRush /Blog Java /Random-VI /Nghỉ giải lao #121. Classpath trong Java là gì và cách cà...

Nghỉ giải lao #121. Classpath trong Java là gì và cách cài đặt nó như thế nào? Tính bất biến trong Java

Xuất bản trong nhóm

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. Nghỉ giải lao #121.  Classpath trong Java là gì và cách cài đặt nó như thế nào?  Tính bất biến trong Java - 1

Đườ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. Nghỉ giải lao #121.  Classpath trong Java là gì và cách cài đặt nó như thế nào?  Tính bất biến trong Java - 2Từ 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ư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 namejoinDate 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ưcuối cùng . Xin lưu ý, nó cũng tạo ra các phương thức toString , EqualshashCode . 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);
    }
}

sai sót

Vấn đề duy nhất với tính bất biến là bộ nhớ bổ sung và quá trình xử lý mà ngay cả một sửa đổi nhỏ cũng yêu cầu. Mỗi lần bạn cần tạo một đối tượng mới, việc này có thể rất tốn kém. Để khắc phục nhược điểm này, bạn có thể triển khai các cơ chế như bộ nhớ đệm và lưu kết quả.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION