JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 121. Was ist Classpath in Java und wie wi...

Kaffeepause Nr. 121. Was ist Classpath in Java und wie wird es installiert? Unveränderlichkeit in Java

Veröffentlicht in der Gruppe Random-DE

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. Kaffeepause Nr. 121.  Was ist Classpath in Java und wie wird es installiert?  Unveränderlichkeit in Java - 1

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 letzteKaffeepause Nr. 121.  Was ist Classpath in Java und wie wird es installiert?  Unveränderlichkeit in Java - 2 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);
    }
}

Mängel

Das einzige Problem bei der Unveränderlichkeit ist der zusätzliche Speicher und die Verarbeitung, die selbst eine kleine Änderung erfordert. Jedes Mal müssen Sie ein neues Objekt erstellen, was sehr teuer sein kann. Um diesen Nachteil zu umgehen, können Sie Mechanismen wie Caching und Speichern von Ergebnissen implementieren.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION