JavaRush /Blog Java /Random-ES /Pausa para el café #124. Patrón de diseño de constructor....

Pausa para el café #124. Patrón de diseño de constructor. Cómo funcionan la serialización y la deserialización en Java

Publicado en el grupo Random-ES

Patrón de diseño de constructor en Java

Fuente: Medio En este artículo, aprenderemos cómo diseñar y crear objetos para una clase usando el patrón de diseño Builder . Pausa para el café #124.  Patrón de diseño de constructor.  Cómo funcionan la serialización y la deserialización en Java - 1

¿Por qué necesitamos el patrón de diseño Builder?

El patrón Builder está diseñado para crear objetos utilizando una clase estática pública anidada que tiene los mismos campos de datos que la clase externa. El patrón Builder se creó para resolver problemas que estaban presentes en los patrones de diseño Factory y Abstract Factory cuando un objeto de clase contiene muchos valores de campo y/o datos. Antes de pasar al patrón Builder , veamos exactamente qué problemas surgen con los patrones Factory y Abstract Factory para escenarios donde un objeto tiene muchos valores de campo:
  1. Tener demasiados argumentos para pasar del programa cliente a la clase Factory puede provocar errores porque la mayoría de las veces el tipo de argumento es el mismo y es difícil mantener el orden de los argumentos en el lado del cliente.

  2. Algunos parámetros pueden ser opcionales, pero en el patrón Factory estamos obligados a enviar todos los parámetros, y los parámetros opcionales deben enviarse como archivos NULL .

  3. Si el objeto es “pesado” y tiene un diseño complejo, entonces todas estas dificultades pasarán a formar parte de las clases Factory, lo que a menudo genera confusión.

Los problemas anteriores se pueden resolver cuando el objeto tiene una gran cantidad de parámetros. Para hacer esto, simplemente necesita proporcionar al constructor los parámetros requeridos y luego varios métodos de configuración para configurar los parámetros opcionales. Tenga en cuenta que el problema con este método es que el estado del objeto seguirá siendo inconsistente a menos que todos los atributos estén claramente establecidos.

¿Qué es el patrón de diseño Builder?

El patrón Builder resuelve el problema de tener muchos parámetros opcionales y estados inconsistentes al proporcionar una manera de construir un objeto paso a paso. Esto utiliza un método que realmente devuelve el objeto final.

¿Cómo implementar el patrón de diseño Builder en Java?

Si seguimos los pasos a continuación, obtenemos el proceso paso a paso de crear un objeto y recuperarlo:
  1. Cree una clase anidada estática como clase Builder y luego copie todos los campos de la clase externa a la clase Builder . Tenemos que seguir una convención de nomenclatura, por lo que si el nombre de la clase es Person , entonces la clase Builder debería llamarse PersonBuilder .

  2. La clase Builder debe tener un constructor público con todos los campos obligatorios como parámetros.

  3. La clase Builder debe tener métodos para establecer los parámetros opcionales y debe devolver el mismo objeto Builder después de configurar el campo opcional.

  4. El último paso es proporcionar un método build() en la clase Builder , que devolverá el objeto que necesita el programa cliente. Para hacer esto necesitamos tener un constructor privado en la clase principal con la clase Builder como argumento.

Ejemplo:

Veamos un ejemplo para comprender claramente el patrón de diseño Builder .
public class Employee {

    private String name;
    private String company;
    private boolean hasCar;//optional
    private boolean hasBike;//optional

    private Employee(EmployeeBuilder employeeBuilder) {
        name = employeeBuilder.name;
        company = employeeBuilder.company;
        hasCar = employeeBuilder.hasCar;
        hasBike = employeeBuilder.hasBike;
    }

    public String getName() {
        return name;
    }

    public String getCompany() {
        return company;
    }

    public boolean isHasCar() {
        return hasCar;
    }

    public boolean isHasBike() {
        return hasBike;
    }

    public static class EmployeeBuilder {
        private String name;
        private String company;
        private boolean hasCar;//optional
        private boolean hasBike;//optional

        //constructor for required fields
        public EmployeeBuilder(String name, String company) {
            this.name = name;
            this.company = company;
        }

        //setter methods for optional fields
        public EmployeeBuilder setHasCar(boolean hasCar) {
            this.hasCar = hasCar;
            return this;
        }

        public EmployeeBuilder setHasBike(boolean hasBike) {
            this.hasBike = hasBike;
            return this;
        }

        //Build the Employee object
        public Employee build() {
            return new Employee(this);
        }
    }
}

class TestBuilder {
    public static void main(String[] args) {
        //Building the object of Employee thru the build() method provided in EmployeeBuilder class.
        Employee employee = new Employee.EmployeeBuilder("Vikram", "ABC").setHasBike(false).setHasBike(true).build();
    }
}
Ejemplo de patrón Builder : java.lang.StringBuilder y java.lang.StringBuffer utilizaron el patrón Builder para construir objetos.

Cómo funcionan la serialización y la deserialización en Java

Fuente: Medio Me cambié a Java en enero de este año después de una pasantía. Antes de esto, escribía principalmente en PHP y un poco de JavaScript. Nunca antes me había encontrado con la serialización, aunque la serialización en realidad existe en PHP. Es cierto que en Java se usa con mucha más frecuencia. Hoy les presentaré cómo funcionan la serialización y deserialización en Java y varias formas de usarlas.

¿Qué es la serialización y la deserialización?

La serialización es la transformación de un objeto de una clase en una secuencia de bytes en la Máquina Virtual Java (JVM) para su transmisión a otra Máquina Virtual Java. Si la máquina virtual Java recrea un objeto a partir de bytes, el proceso se denomina deserialización.

Ejemplo de serialización y deserialización.

Publicación por entregas

Creemos una clase cuyo objeto será serializado:
import java.io.*;

public class Person implements Serializable{

int id = 0;
String name = "empty";

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
La clase Persona implementa Serializable para que su objeto pueda serializarse/deserializarse. La clase Persona tiene dos campos: identificador y nombre, que cambian del valor predeterminado cuando se crea una instancia de la clase. La interfaz serializable y otras clases utilizadas en el programa se importaron al paquete Java.io.
public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));

try {

out.writeObject(person);
System.out.println("Success");
} catch(Exception e) {

System.out.println("Unsuccessful");
} finally {

if(out != null) {

out.close();
}
}
}
Como sabe, el método principal inicia la serialización e imprime un mensaje de éxito; de lo contrario, se imprime un mensaje de error. Para serializar objetos utilizamos ObjectOutputStream y el método writeObject .

Deserialización

public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));

try {

Person personObj = (Person)in.readObject();
System.out.println("Person Id is " +personObj.id + " while name is " + personObj.name);
} catch (Exception e) {

e.printStackTrace();
} finally {

if(in != null) {

in.close();
}
}
}
La deserialización es lo opuesto a la serialización. Para reconstruir un objeto a partir de una secuencia de bytes, utilice ObjectInputStream y el método readObject . Tenga en cuenta que para proporcionar acceso a los campos de la clase Persona , el objeto se convierte al tipo de datos Persona . Un objeto de clase que no implementa la interfaz de serialización no se puede serializar. Por lo tanto, cualquier clase que haga referencia a una clase que implemente una interfaz de serialización debe implementar ella misma la interfaz de serialización; de lo contrario, se generará una excepción. La serialización es independiente de la plataforma, lo que significa que otra máquina virtual Java puede deserializar el flujo de bytes que se serializa. Los campos estáticos y transitorios no son serializables, por lo que si tiene un campo que no desea serializar, hágalo temporal o estático. En el caso de un campo estático, no se serializa porque un campo estático pertenece a una clase y no a un objeto. Debido a esto, el estado de transición impide que el campo se serialice. La serialización se utiliza en Hibernate, JPA y RMI. La serialización también se puede personalizar. Esto se llama serialización personalizada.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION