JavaRush /Blog Java /Random-FR /Pause café #124. Modèle de conception de constructeur. Co...

Pause café #124. Modèle de conception de constructeur. Comment fonctionnent la sérialisation et la désérialisation en Java

Publié dans le groupe Random-FR

Modèle de conception de constructeur en Java

Source : Medium Dans cet article, nous apprendrons comment concevoir et créer des objets pour une classe à l'aide du modèle de conception Builder . Pause café #124.  Modèle de conception de constructeur.  Comment fonctionnent la sérialisation et la désérialisation en Java - 1

Pourquoi avons-nous besoin du modèle de conception Builder ?

Le modèle Builder est conçu pour créer des objets à l'aide d'une classe statique publique imbriquée qui possède les mêmes champs de données que la classe externe. Le modèle Builder a été créé pour résoudre les problèmes présents dans les modèles de conception Factory et Abstract Factory lorsqu'un objet de classe contient de nombreuses valeurs de champ et/ou données. Avant de passer au modèle Builder , examinons exactement les problèmes qui surviennent avec les modèles Factory et Abstract Factory pour les scénarios dans lesquels un objet a de nombreuses valeurs de champ :
  1. Avoir trop d'arguments à transmettre du programme client à la classe Factory peut provoquer des erreurs car la plupart du temps le type d'argument est le même et il est difficile de maintenir l'ordre des arguments côté client.

  2. Certains paramètres peuvent être facultatifs, mais dans le modèle Factory , nous sommes obligés d'envoyer tous les paramètres, et les paramètres facultatifs doivent être envoyés sous forme de fichiers NULL .

  3. Si l'objet est « lourd » et de conception complexe, alors toutes ces difficultés feront partie des classes Factory, ce qui prête souvent à confusion.

Les problèmes ci-dessus peuvent être résolus lorsque l’objet possède un grand nombre de paramètres. Pour ce faire, il vous suffit de fournir au constructeur les paramètres requis, puis diverses méthodes de définition pour définir les paramètres facultatifs. Notez que le problème avec cette méthode est que l'état de l'objet restera incohérent à moins que tous les attributs ne soient clairement définis.

Qu'est-ce que le modèle de conception Builder ?

Le modèle Builder résout le problème de la présence d'un grand nombre de paramètres facultatifs et d'états incohérents en fournissant un moyen de créer un objet étape par étape. Cela utilise une méthode qui renvoie réellement l'objet final.

Comment implémenter le modèle de conception Builder en Java ?

Si nous suivons les étapes ci-dessous, nous obtenons le processus étape par étape de création d'un objet et de sa récupération :
  1. Créez une classe imbriquée statique en tant que classe Builder , puis copiez tous les champs de la classe externe vers la classe Builder . Nous devons suivre une convention de dénomination, donc si le nom de la classe est Person , alors la classe Builder doit s'appeler PersonBuilder .

  2. La classe Builder doit avoir un constructeur public avec tous les champs obligatoires comme paramètres.

  3. La classe Builder doit disposer de méthodes pour définir les paramètres facultatifs et doit renvoyer le même objet Builder après avoir défini le champ facultatif.

  4. La dernière étape consiste à fournir une méthode build() dans la classe Builder , qui renverra l'objet nécessaire au programme client. Pour ce faire, nous devons avoir un constructeur privé dans la classe principale avec la classe Builder comme argument.

Exemple:

Regardons un exemple pour bien comprendre le modèle de conception 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();
    }
}
Exemple de modèle Builder : java.lang.StringBuilder et java.lang.StringBuffer ont utilisé le modèle Builder pour créer des objets.

Comment fonctionnent la sérialisation et la désérialisation en Java

Source : Medium Je suis passé à Java en janvier de cette année après un stage. Avant cela, j'écrivais principalement en PHP et un peu de JavaScript. Je n'avais jamais rencontré de sérialisation auparavant, même si la sérialisation existe réellement en PHP. Certes, en Java, il est utilisé beaucoup plus souvent. Aujourd'hui, je vais vous présenter le fonctionnement de la sérialisation et de la désérialisation en Java et plusieurs façons de les utiliser.

Qu'est-ce que la sérialisation et la désérialisation

La sérialisation est la transformation d'un objet d'une classe en une séquence d'octets dans la machine virtuelle Java (JVM) pour transmission à une autre machine virtuelle Java. Si la machine virtuelle Java recrée un objet à partir d'octets, le processus est appelé désérialisation.

Exemple de sérialisation et de désérialisation

Sérialisation

Créons une classe dont l'objet sera sérialisé :
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 classe Person implémente Serialisable afin que son objet puisse être sérialisé/désérialisé. La classe Person comporte deux champs : identifiant et nom, qui changent de la valeur par défaut lorsqu'une instance de la classe est créée. L'interface Serialisable et d'autres classes utilisées dans le programme ont été importées dans le package 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();
}
}
}
Comme vous le savez, la méthode main démarre la sérialisation et imprime un message de réussite, sinon un message d'erreur est imprimé. Pour sérialiser des objets, nous utilisons ObjectOutputStream et la méthode writeObject .

Désérialisation

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 désérialisation est l'inverse de la sérialisation. Pour reconstruire un objet à partir d'une séquence d'octets, utilisez ObjectInputStream et la méthode readObject . Notez que pour donner accès aux champs de la classe Person , l'objet est converti en type de données Person . Un objet de classe qui n'implémente pas l'interface de sérialisation ne peut pas être sérialisé. Par conséquent, toute classe qui fait référence à une classe qui implémente une interface de sérialisation doit elle-même implémenter l'interface de sérialisation, sinon une exception sera levée. La sérialisation est indépendante de la plate-forme, ce qui signifie que le flux d'octets en cours de sérialisation peut être désérialisé par une autre machine virtuelle Java. Les champs statiques et transitoires ne sont pas sérialisables, donc si vous avez un champ que vous ne souhaitez pas sérialiser, rendez-le temporaire ou statique. Dans le cas d'un champ statique, il n'est pas sérialisé car un champ statique appartient à une classe et non à un objet. De ce fait, l’état de transition empêche la sérialisation du champ. La sérialisation est utilisée dans Hibernate, JPA et RMI. La sérialisation peut également être personnalisée. C'est ce qu'on appelle la sérialisation personnalisée.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION