JavaRush /Blog Java /Random-ES /Pausa para el café #121. ¿Qué es Classpath en Java y cómo...

Pausa para el café #121. ¿Qué es Classpath en Java y cómo instalarlo? Inmutabilidad en Java

Publicado en el grupo Random-ES

¿Qué es Classpath en Java y cómo instalarlo?

Fuente: Medio Conocer los conceptos básicos de la programación y el flujo de ejecución de los archivos de programa nos ayuda a comprender un lenguaje. Conocer el parámetro Classpath es uno de los conceptos básicos que todo desarrollador de Java debe conocer. Hoy discutiremos qué es un classpath ( Classpath ), cómo configurarlo y cómo ayuda a la JVM a ejecutar archivos de clase. Pausa para el café #121.  ¿Qué es Classpath en Java y cómo instalarlo?  Inmutabilidad en Java - 1

¿Qué es Classpath?

Classpath es uno de los parámetros básicos en Java, pero los recién llegados a la programación a menudo lo malinterpretan. Para simplificar, un Classpath es simplemente un conjunto de rutas a lo largo de las cuales el compilador de Java y la JVM deben encontrar las clases necesarias para compilar o ejecutar otras clases.

Cómo Classpath ayuda a JVM a ejecutar archivos de clase

Comencemos con un ejemplo. Supongamos que tenemos un archivo Main.java que se encuentra en la carpeta /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");
    }
}
Digamos que estamos en /Users/vikram/Documents y queremos compilar esta clase:

javac test-java/src/com/programming/v1/Main.java
Ahora, para ejecutar este archivo de clase, necesitamos decirle a la máquina virtual Java dónde buscar el archivo .class usando classpath o el indicador cp en el 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
El primer parámetro es la carpeta raíz donde está escrito el paquete. El segundo parámetro es el nombre del paquete con el nombre de la clase. Cuando se ejecuta un comando Java, la máquina virtual Java busca en la carpeta test-java/src y luego carga la clase principal para ejecutarlo.

Cómo configurar la variable Classpath

La variable Classpath se puede configurar como se muestra a continuación en máquinas Linux:

export CLASSPATH="test-java/src"
Classpath en una máquina con Windows se puede agregar/actualizar utilizando variables de entorno. Una vez configurada la variable de entorno, el comando java se puede ejecutar como se muestra a continuación:

vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
Eso es todo lo que hay que saber sobre Classpath . ¡Gracias por leer!

Inmutabilidad en Java

Fuente: Medio Las variables en Java son de dos tipos: primitivas y de referencia. Todo en Java se pasa por valor, pero en el caso de los tipos de referencia, los datos de origen se pueden actualizar utilizando la dirección de memoria pasada. Pausa para el café #121.  ¿Qué es Classpath en Java y cómo instalarlo?  Inmutabilidad en Java - 2La palabra clave final se utiliza para hacer que la variable actúe como una constante, es decir, evitar la reasignación. Esto funciona bien para primitivas que no tienen memoria de montón, mientras que para los tipos de referencia solo la reasignación es limitada y se puede cambiar el estado interno. Esto puede generar muchos problemas de simultaneidad y condiciones de carrera. Por lo tanto, incluir características inmutables en un tipo normal en Java proporciona muchos beneficios.

Beneficios de la inmutabilidad en Java

1. Seguridad del hilo

Los tipos inmutables son inmunes a las condiciones de carrera en un entorno de subprocesos múltiples porque el objeto seguirá siendo consistente después de su creación. Varios subprocesos no pueden cambiar su estado interno, por lo que no se requiere sincronización.

2. Tipo fundamental

String en la biblioteca estándar de Java es un buen ejemplo de clase base. Esta es una clase muy simple e inmutable que se puede usar para construir dominios de lógica de negocios sobre ella. Del mismo modo, un tipo inmutable puede actuar como un excelente tipo base sobre el cual construir.

Características

1. Campos Privado y Final

Los campos que contienen el estado de un objeto son privados y finales . La visibilidad privada impide el acceso directo al campo, mientras que la visibilidad final garantiza que el campo se asigne sólo una vez.

2. Sin métodos modificadores

No se puede acceder al campo privado fuera de la clase. Normalmente, se proporcionan métodos de acceso (captadores) y métodos modificadores (definidores), respectivamente, para leer y escribir en los campos. Para garantizar la coherencia, no se permiten modificadores.

3. Clase final

Permitir la herencia de clases puede romper la inmutabilidad. Una subclase que extiende una clase inmutable puede afectar el estado de un objeto. Por tanto, la clase es definitiva .

4. Copias defensivas

Durante la creación de objetos, en lugar de asignar argumentos del constructor directamente a campos privados, la creación de una copia profunda (o copia inmutable) de los argumentos proporcionará modificaciones externas. Si uno de los argumentos es un tipo de referencia, puede ser manipulado fácilmente por parte de la persona que llama. La creación de copias protectoras le permite evitar esta manipulación. De manera similar, para los descriptores de acceso (captadores), en lugar de hacer referencia directa a un campo interno, se puede compartir libremente una copia del mismo.

Implementación

Empleado


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;
    }
}
  • No todos los campos tienen copias protectoras en el constructor. Esto se debe a que la identificación es primitiva y los campos nombre y fecha de unión son tipos inmutables. La persona que llama no puede cambiarlos y permanecerán sin cambios, mientras que el campo de logros requiere una copia del argumento realizado utilizando el método List.copyOf . Esto se debe a que copyOf devuelve una List inmutable .

  • Del mismo modo, los métodos de acceso devuelven campos directamente en lugar de copias defensivas porque todos los tipos de campos son inmutables (incluidos los logros ) y, por lo tanto, no se pueden modificar fuera de la clase.

Mejoras

Antes de Java 16

La implementación de Employee se puede mejorar con bibliotecas como Lombok . Esto reduce la verbosidad en el código y ayuda a que se vea más limpio. La biblioteca viene con anotaciones para acortar el código estándar. @Value (anotación) se puede utilizar para crear captadores y un constructor para todos los argumentos. Esto también crea una clase final y campos privados y finales . Como nota, también genera los métodos toString , equals y hashCode . La implementación de Empleado se puede reescribir usando @Value como se muestra a continuación:

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 y posterior

La versión Java 16 introdujo una nueva función de grabación . Estas (como lo afirma JEP) son clases que actúan como portadores transparentes de datos inmutables y pueden considerarse como tuplas nominales. La clase Empleado se puede volver a implementar como registro Empleado como se muestra a continuación.

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);
    }
}

Defectos

El único problema con la inmutabilidad es la memoria y el procesamiento adicionales que requiere incluso una pequeña modificación. Cada vez es necesario crear un nuevo objeto, lo que puede resultar muy costoso. Para solucionar este inconveniente, puede implementar mecanismos como el almacenamiento en caché y el guardado de resultados.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION