Was ist Classpath in Java und wie wird es installiert?
Quelle: Medium Die Kenntnis der Grundlagen der Programmierung und des Ausführungsablaufs von Programmdateien hilft uns, eine Sprache zu verstehen. Die Kenntnis des Classpath- Parameters ist eines der Grundkonzepte, die jeder Java-Entwickler kennen sollte. Heute besprechen wir, was ein Klassenpfad ( Classpath ) ist, wie man ihn festlegt und wie er der JVM bei der Ausführung von Klassendateien hilft.Was ist Classpath?
Der Klassenpfad ist einer der Grundparameter in Java, wird jedoch von Programmierneulingen oft missverstanden. Vereinfacht ausgedrückt ist ein Klassenpfad einfach eine Reihe von Pfaden, entlang derer der Java-Compiler und die JVM die erforderlichen Klassen finden müssen, um andere Klassen zu kompilieren oder auszuführen.Wie Classpath JVM bei der Ausführung von Klassendateien unterstützt
Beginnen wir mit einem Beispiel. Nehmen wir an, wir haben eine Main.java- Datei , die sich im Ordner /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java befindet .package com.programming.v1;
public class Main {
public static void main(String[] args) {
System.out.println("Hello classpath");
}
}
Nehmen wir an, wir befinden uns in /Users/vikram/Documents und möchten diese Klasse kompilieren:
javac test-java/src/com/programming/v1/Main.java
Um diese Klassendatei auszuführen, müssen wir der Java Virtual Machine nun mitteilen, wo sie nach der .class- Datei suchen soll, indem wir den Klassenpfad oder das cp- Flag im Java- Befehl verwenden .
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
Der erste Parameter ist der Stammordner, in den das Paket geschrieben wird. Der zweite Parameter ist der Paketname mit dem Klassennamen. Wenn ein Java-Befehl ausgeführt wird, sucht die Java Virtual Machine im Ordner test-java/src und lädt dann die Hauptklasse, um ihn auszuführen.
So legen Sie die Classpath-Variable fest
Die Classpath- Variable kann auf Linux-Rechnern wie unten gezeigt festgelegt werden:export CLASSPATH="test-java/src"
Der Klassenpfad auf einem Windows-Computer kann mithilfe von Umgebungsvariablen hinzugefügt/aktualisiert werden. Sobald die Umgebungsvariable festgelegt ist, kann der Java- Befehl wie unten gezeigt ausgeführt werden:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Das ist alles, was Sie über Classpath wissen müssen . Vielen Dank fürs Lesen!
Unveränderlichkeit in Java
Quelle: Medium Variablen in Java gibt es in zwei Typen: primitiv und referenzierend. Alles in Java wird als Wert übergeben, aber im Fall von Referenztypen können die Quelldaten mithilfe der übergebenen Speicheradresse aktualisiert werden. Das letzte Schlüsselwort wird verwendet, um die Variable als Konstante wirken zu lassen, d. h. eine Neuzuweisung zu vermeiden. Dies funktioniert gut für Grundelemente, die keinen Heap-Speicher haben, während bei Referenztypen nur die Neuzuweisung begrenzt ist und der interne Status geändert werden kann. Dies kann zu vielen Parallelitätsproblemen und Rennbedingungen führen. Daher bietet die Einbeziehung unveränderlicher Merkmale in einen regulären Typ in Java viele Vorteile.Vorteile der Unveränderlichkeit in Java
1. Thread-Sicherheit
Unveränderliche Typen sind in einer Multithread-Umgebung immun gegen Race Conditions, da das Objekt nach seiner Erstellung konsistent bleibt. Mehrere Threads können ihren internen Status nicht ändern, daher ist keine Synchronisierung erforderlich.2. Grundtyp
String in der Java-Standardbibliothek ist ein gutes Beispiel für eine Basisklasse. Dies ist eine sehr einfache und unveränderliche Klasse, mit der darauf Geschäftslogikdomänen aufgebaut werden können. Ebenso kann ein unveränderlicher Typ als hervorragender Basistyp dienen, auf dem man aufbauen kann.Eigenschaften
1. Private und endgültige Felder
Die Felder, die den Status eines Objekts enthalten, sind private und final . Die private Sichtbarkeit verhindert den direkten Zugriff auf das Feld, während die endgültige Sichtbarkeit dafür sorgt , dass das Feld nur einmal zugewiesen wird.2. Keine Modifikatormethoden
Auf das private Feld kann außerhalb der Klasse nicht zugegriffen werden. Typischerweise werden Zugriffsmethoden (Getter) bzw. Modifikatormethoden (Setter) zum Lesen und Schreiben in Felder bereitgestellt. Um die Konsistenz sicherzustellen, sind Modifikatoren nicht zulässig.3. Abschlussklasse
Das Zulassen der Klassenvererbung kann die Unveränderlichkeit beeinträchtigen. Eine Unterklasse, die eine unveränderliche Klasse erweitert, kann den Zustand eines Objekts beeinflussen. Daher ist die Klasse final .4. Defensive Kopien
Während der Objekterstellung werden Argumente vom Konstruktor nicht direkt privaten Feldern zugewiesen, sondern eine tiefe Kopie (oder unveränderliche Kopie) der Argumente erstellt, um eine externe Änderung zu ermöglichen. Wenn eines der Argumente ein Referenztyp ist, kann er vom Aufrufer leicht manipuliert werden. Durch das Erstellen von Schutzkopien können Sie diese Manipulation vermeiden. Ebenso kann bei Accessoren (Gettern) eine Kopie davon frei geteilt werden, anstatt direkt auf ein internes Feld zu verweisen.Implementierung
Mitarbeiter
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;
}
}
-
Nicht alle Felder verfügen im Konstruktor über Schutzkopien. Dies liegt daran, dass id primitiv ist und die Felder „name“ und „joinDate“ unveränderliche Typen sind. Sie können vom Aufrufer nicht geändert werden und bleiben unverändert, während das Feld „Erfolge“ eine Kopie des Arguments erfordert, das mit der List.copyOf- Methode erstellt wurde . Dies liegt daran, dass copyOf eine unveränderliche List zurückgibt .
-
Ebenso geben Zugriffsmethoden Felder direkt zurück und nicht defensive Kopien, da alle Feldtypen unveränderlich sind (einschließlich Achievements ) und daher nicht außerhalb der Klasse geändert werden können.
Verbesserungen
Vor Java 16
Die Employee- Implementierung kann mit Bibliotheken wie Lombok verbessert werden . Dies reduziert die Ausführlichkeit des Codes und trägt dazu bei, dass er sauberer aussieht. Die Bibliothek enthält Anmerkungen, um den Standardcode zu verkürzen. Mit @Value (Annotation) können Getter und ein Konstruktor für alle Argumente erstellt werden. Dadurch werden auch eine finale Klasse sowie private und finale Felder erstellt . Hinweis: Es werden auch die Methoden toString , equal und hashCode generiert . Die Employee- Implementierung kann mit @Value wie unten gezeigt umgeschrieben werden :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 und höher
Mit der Java 16-Version wurde eine neue Aufnahmefunktion eingeführt . Dies sind (wie von JEP angegeben) Klassen, die als transparente Träger unveränderlicher Daten fungieren und als nominale Tupel betrachtet werden können. Die Employee- Klasse kann wie unten gezeigt als Datensatz-Employee erneut implementiert werden .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