JavaRush /Java Blog /Random-IT /Pausa caffè #121. Cos'è Classpath in Java e come installa...

Pausa caffè #121. Cos'è Classpath in Java e come installarlo? Immutabilità in Java

Pubblicato nel gruppo Random-IT

Cos'è Classpath in Java e come installarlo?

Fonte: Medium Conoscere le basi della programmazione e il flusso di esecuzione dei file di programma ci aiuta a comprendere un linguaggio. Conoscere il parametro Classpath è uno dei concetti base che ogni sviluppatore Java dovrebbe conoscere. Oggi discuteremo cos'è un classpath ( Classpath ), come impostarlo e come aiuta la JVM a eseguire i file di classe. Pausa caffè #121.  Cos'è Classpath in Java e come installarlo?  Immutabilità in Java - 1

Cos'è Classpath?

Classpath è uno dei parametri di base in Java, ma spesso viene frainteso dai principianti della programmazione. Per semplificare, un Classpath è semplicemente un insieme di percorsi lungo i quali il compilatore Java e la JVM devono trovare le classi necessarie per compilare o eseguire altre classi.

In che modo Classpath aiuta JVM nell'esecuzione dei file di classe

Cominciamo con un esempio. Supponiamo di avere un file Main.java che si trova nella cartella /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");
    }
}
Diciamo che siamo in /Users/vikram/Documents e vogliamo compilare questa classe:
javac test-java/src/com/programming/v1/Main.java
Ora, per eseguire questo file di classe, dobbiamo dire alla Java Virtual Machine dove cercare il file .class utilizzando classpath o il flag cp nel comando 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
Il primo parametro è la cartella radice in cui è scritto il pacchetto. Il secondo parametro è il nome del pacchetto con il nome della classe. Quando viene eseguito un comando Java, la Java Virtual Machine cerca nella cartella test-java/src e quindi carica la classe principale per eseguirlo.

Come impostare la variabile Classpath

La variabile Classpath può essere impostata come mostrato di seguito sulle macchine Linux:
export CLASSPATH="test-java/src"
Il percorso di classe su un computer Windows può essere aggiunto/aggiornato utilizzando variabili di ambiente. Una volta impostata la variabile di ambiente, il comando Java può essere eseguito come mostrato di seguito:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Questo è tutto quello che c'è da sapere su Classpath . Grazie per aver letto!

Immutabilità in Java

Fonte: Medium Le variabili in Java sono di due tipi: primitiva e di riferimento. Tutto in Java viene passato per valore, ma nel caso dei tipi di riferimento, i dati di origine possono essere aggiornati utilizzando l'indirizzo di memoria passato. Pausa caffè #121.  Cos'è Classpath in Java e come installarlo?  Immutabilità in Java - 2La parola chiave final viene utilizzata per far sì che la variabile agisca come costante, ovvero per evitare la riassegnazione. Funziona bene per le primitive che non dispongono di memoria heap, mentre per i tipi di riferimento solo la riassegnazione è limitata e lo stato interno può essere modificato. Ciò può portare a molti problemi di concorrenza e condizioni di competizione. Pertanto, includere caratteristiche immutabili in un tipo regolare in Java offre molti vantaggi.

Vantaggi dell'immutabilità in Java

1. Sicurezza del filo

I tipi immutabili sono immuni alle race conditions in un ambiente multi-thread perché l'oggetto rimarrà coerente dopo la creazione. Più thread non possono modificare il proprio stato interno, quindi la sincronizzazione non è necessaria.

2. Tipo fondamentale

La stringa nella libreria standard Java è un buon esempio di classe base. Questa è una classe molto semplice e immutabile che può essere utilizzata per creare domini di logica aziendale sopra di essa. Allo stesso modo, un tipo immutabile può fungere da ottimo tipo di base su cui costruire.

Caratteristiche

1. Campi privati ​​e finali

I campi che contengono lo stato di un oggetto sono privati ​​e finali . La visibilità privata impedisce l'accesso diretto al campo, mentre la visibilità finale garantisce che il campo venga assegnato una sola volta.

2. Nessun metodo modificatore

Non è possibile accedere al campo privato al di fuori della classe. In genere, vengono forniti rispettivamente metodi di accesso (getter) e metodi di modifica (setter) per leggere e scrivere nei campi. Per garantire la coerenza, i modificatori non sono consentiti.

3. Lezione finale

Consentire l'ereditarietà della classe potrebbe interrompere l'immutabilità. Una sottoclasse che estende una classe immutabile può influenzare lo stato di un oggetto. Pertanto la lezione è definitiva .

4. Copie difensive

Durante la creazione dell'oggetto, invece di assegnare argomenti dal costruttore direttamente ai campi privati, la creazione di una copia profonda (o copia immutabile) degli argomenti fornirà una modifica esterna. Se uno degli argomenti è un tipo di riferimento, può essere facilmente manipolato dal chiamante. La creazione di copie protettive consente di evitare questa manipolazione. Allo stesso modo, per gli accessori (getter), invece di fare riferimento direttamente a un campo interno, è possibile condividerne liberamente una copia.

Implementazione

Dipendente

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;
    }
}
  • Non tutti i campi hanno copie protettive nel costruttore. Questo perché id è primitivo e i campi name e joinDate sono tipi immutabili. Non possono essere modificati dal chiamante e rimarranno invariati, mentre il campo dei risultati richiede una copia dell'argomento effettuato utilizzando il metodo List.copyOf . Questo perché copyOf restituisce un List immutabile .

  • Allo stesso modo, i metodi di accesso restituiscono i campi direttamente anziché copie difensive perché tutti i tipi di campo sono immutabili (compresi i risultati ) e pertanto non possono essere modificati all'esterno della classe.

Miglioramenti

Prima di Java 16

L' implementazione Employee può essere migliorata con librerie come Lombok . Ciò riduce la verbosità del codice e lo aiuta a sembrare più pulito. La libreria viene fornita con annotazioni per abbreviare il codice standard. @Value (annotazione) può essere utilizzato per creare getter e un costruttore per tutti gli argomenti. Ciò crea anche una classe finale e campi privati ​​e finali . Come nota, genera anche metodi toString , equals e hashCode . L' implementazione Employee può essere riscritta utilizzando @Value come mostrato di seguito:
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 e versioni successive

La versione Java 16 ha introdotto una nuova funzionalità di registrazione . Queste (come affermato da JEP) sono classi che agiscono come portatori trasparenti di dati immutabili e possono essere pensate come tuple nominali. La classe Employee può essere reimplementata come record Employee come mostrato di seguito.
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);
    }
}

Screpolatura

L'unico problema con l'immutabilità è la memoria aggiuntiva e l'elaborazione che richiede anche una piccola modifica. Ogni volta è necessario creare un nuovo oggetto, il che può essere molto costoso. Per aggirare questo inconveniente, è possibile implementare meccanismi come la memorizzazione nella cache e il salvataggio dei risultati.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION