Java中的Classpath是什麼以及如何安裝它?
來源:Medium 了解程式設計基礎和程式檔案的執行流程有助於我們理解一門語言。了解Classpath參數是每個Java開發人員都應該了解的基本概念之一。今天我們將討論什麼是類別路徑(Classpath)、如何設定它以及它如何幫助 JVM 執行類別檔案。什麼是類路徑?
類別路徑是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關鍵字用於使變數充當常數,即避免重新賦值。這對於沒有堆記憶體的基元非常有效,而對於參考類型,僅重新分配受到限制並且內部狀態可以更改。這可能會導致許多並發問題和競爭條件。因此,在 Java 的常規類型中包含不可變特性提供了許多好處。Java 中不變性的好處
1. 線程安全
不可變類型不受多執行緒環境中競爭條件的影響,因為物件在建立後將保持一致。多個執行緒無法變更其內部狀態,因此不需要同步。2. 基本型
Java 標準庫中的String是基底類別的一個很好的例子。這是一個非常簡單且不可變的類,可用於在其之上建立業務邏輯域。同樣,不可變類型可以作為建置的基礎類型。特徵
1. Private 和 Final 字段
包含物件狀態的欄位是private和Final。私有可見性可防止直接存取該字段,而最終可見性可確保該字段僅分配一次。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是原始類型,而name和joinDate欄位是不可變類型。它們不能被呼叫者更改並且將保持不變,而成就欄位需要使用List.copyOf方法建立的參數的副本。這是因為copyOf回傳一個不可變的List。
-
同樣,存取器方法直接傳回欄位而不是防禦性副本,因為所有欄位類型都是不可變的(包括成就),因此不能在類別外部進行修改。
改進
Java 16 之前
可以使用Lombok等函式庫來改進Employee實作。這減少了程式碼的冗長並幫助它看起來更乾淨。該庫附帶註釋以縮短標準代碼。@Value(註解)可用於為所有參數建立 getter 和建構子。這也創建了一個最終類別以及私有和最終欄位。需要注意的是,它還產生toString、equals和hashCode方法。可以使用@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);
}
}
GO TO FULL VERSION