JavaRush /Java Blog /Random-TW /喝咖啡休息#121。Java中的Classpath是什麼以及如何安裝它?Java 中的不變性

喝咖啡休息#121。Java中的Classpath是什麼以及如何安裝它?Java 中的不變性

在 Random-TW 群組發布

Java中的Classpath是什麼以及如何安裝它?

來源:Medium 了解程式設計基礎和程式檔案的執行流程有助於我們理解一門語言。了解Classpath參數是每個Java開發人員都應該了解的基本概念之一。今天我們將討論什麼是類別路徑(Classpath)、如何設定它以及它如何幫助 JVM 執行類別檔案。 喝咖啡休息#121。 Java中的Classpath是什麼以及如何安裝它? Java 中的不變性 - 1

什麼是類路徑?

類別路徑是Java中的基本參數之一,但它經常被程式設計新手誤解。簡單來說,類別路徑只是一組路徑,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指令中的cp標誌 告訴 Java 虛擬機器在哪裡找.class檔案。
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資料夾,然後載入主類別來執行它。

如何設定類路徑變數

在 Linux 機器上,可以如下設定 Classpath變數:
export CLASSPATH="test-java/src"
可以使用環境變數新增/更新 Windows 電腦上的類別路徑。 設定好環境變數後,就可以執行java指令了,如下圖:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
這就是關於Classpath 的 全部資訊。感謝您的閱讀!

Java 中的不變性

來源:Medium Java 中的變數有兩種類型:原始變數和引用變數。Java 中的所有內容都是按值傳遞的,但在引用類型的情況下,可以使用傳遞的記憶體位址來更新來源資料。 Final喝咖啡休息#121。 Java中的Classpath是什麼以及如何安裝它? Java 中的不變性 - 2關鍵字用於使變數充當常數,即避免重新賦值。這對於沒有堆記憶體的基元非常有效,而對於參考類型,僅重新分配受到限制並且內部狀態可以更改。這可能會導致許多並發問題和競爭條件。因此,在 Java 的常規類型中包含不可變特性提供了許多好處。

Java 中不變性的好處

1. 線程安全

不可變類型不受多執行緒環境中競爭條件的影響,因為物件在建立後將保持一致。多個執行緒無法變更其內部狀態,因此不需要同步。

2. 基本型

Java 標準庫中的String是基底類別的一個很好的例子。這是一個非常簡單且不可變的類,可用於在其之上建立業務邏輯域。同樣,不可變類型可以作為建置的基礎類型。

特徵

1. Private 和 Final 字段

包含物件狀態的欄位是privateFinal。私有可見性可防止直接存取該字段,而最終可見性可確保字段僅分配一次。

2.無修飾方法

私有欄位不能在類別外部存取。通常,分別提供存取方法(getter)和修飾符方法(setter)來讀取和寫入欄位。為了確保一致性,不允許使用修飾符。

3.最後一堂課

允許類別繼承可能會破壞不變性。擴展不可變類別的子類別可以影響物件的狀態。因此,該課程是最終的

4. 防禦性副本

在物件建立期間,不是將建構函數中的參數直接指派給私有字段,而是建立參數的深層副本(或不可變副本)將提供外部修改。如果參數之一是引用類型,則可以在呼叫方端輕鬆對其進行操作。建立保護副本可以讓您避免這種操作。類似地,對於訪問器(getters),不是直接引用內部字段,而是可以自由共享它的副本。

執行

員工

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是原始類型,而namejoinDate欄位是不可變類型。它們不能被呼叫者更改並且將保持不變,而成就欄位需要使用List.copyOf方法建立的參數的副本。這是因為copyOf回傳一個不可變的List

  • 同樣,存取器方法直接傳回欄位而不是防禦性副本,因為所有欄位類型都是不可變的(包括成就),因此不能在類別外部進行修改。

改進

Java 16 之前

可以使用Lombok等函式庫來改進Employee實作。這減少了程式碼的冗長並幫助它看起來更乾淨。該庫附帶註釋以縮短標準代碼。@Value(註解)可用於為所有參數建立 getter 和建構子。這也創建了一個最終類別以及私有最終欄位。需要注意的是,它還產生toStringequalshashCode方法。可以使用@Value重寫Employee實現,如下所示:
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 所述)是充當不可變資料的透明載體的類,並且可以被視為名義元組。Employee類別可以重新實作為記錄 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);
    }
}

缺陷

不變性的唯一問題是即使是很小的修改也需要額外的記憶體和處理。每次都需要建立一個新對象,這可能非常昂貴。為了解決這個缺點,您可以實現快取和保存結果等機制。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION