JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 124. Builder-Entwurfsmuster. Wie Serialis...

Kaffeepause Nr. 124. Builder-Entwurfsmuster. Wie Serialisierung und Deserialisierung in Java funktionieren

Veröffentlicht in der Gruppe Random-DE

Builder-Entwurfsmuster in Java

Quelle: Medium In diesem Artikel erfahren Sie, wie Sie mithilfe des Builder- Entwurfsmusters Objekte für eine Klasse entwerfen und erstellen . Kaffeepause Nr. 124.  Builder-Entwurfsmuster.  Wie Serialisierung und Deserialisierung in Java funktionieren – 1

Warum brauchen wir das Builder-Entwurfsmuster?

Das Builder- Muster dient zum Erstellen von Objekten mithilfe einer verschachtelten öffentlichen statischen Klasse, die über dieselben Datenfelder wie die äußere Klasse verfügt. Das Builder- Muster wurde erstellt, um Probleme zu lösen, die in den Entwurfsmustern Factory und Abstract Factory auftraten, wenn ein Klassenobjekt viele Feldwerte und/oder Daten enthielt. Bevor wir zum Builder- Muster übergehen , schauen wir uns genau an, welche Probleme mit den Factory- und Abstract Factory- Mustern für Szenarien auftreten, in denen ein Objekt viele Feldwerte hat:
  1. Wenn zu viele Argumente vom Clientprogramm an die Factory- Klasse übergeben werden müssen, kann dies zu Fehlern führen, da der Argumenttyp in den meisten Fällen derselbe ist und es schwierig ist, die Reihenfolge der Argumente auf der Clientseite beizubehalten.

  2. Einige Parameter können optional sein, aber im Factory- Muster sind wir gezwungen, alle Parameter zu senden, und optionale Parameter müssen als NULL- Dateien gesendet werden .

  3. Wenn das Objekt „schwer“ und komplex gestaltet ist, werden all diese Schwierigkeiten Teil der Factory-Klassen, was oft zu Verwirrung führt.

Die oben genannten Probleme können gelöst werden, wenn das Objekt über eine große Anzahl von Parametern verfügt. Dazu müssen Sie dem Konstruktor lediglich die erforderlichen Parameter und anschließend verschiedene Setter- Methoden zur Verfügung stellen, um die optionalen Parameter festzulegen. Beachten Sie, dass das Problem bei dieser Methode darin besteht, dass der Status des Objekts inkonsistent bleibt , sofern nicht alle Attribute eindeutig festgelegt sind.

Was ist das Builder-Entwurfsmuster?

Das Builder- Muster löst das Problem vieler optionaler Parameter und inkonsistenter Zustände, indem es eine Möglichkeit bietet, ein Objekt Schritt für Schritt zu erstellen. Dabei wird eine Methode verwendet, die tatsächlich das endgültige Objekt zurückgibt.

Wie implementiert man das Builder-Entwurfsmuster in Java?

Wenn wir die folgenden Schritte ausführen, erhalten wir den schrittweisen Prozess zum Erstellen und Abrufen eines Objekts:
  1. Erstellen Sie eine statisch verschachtelte Klasse als Builder - Klasse und kopieren Sie dann alle Felder von der äußeren Klasse in die Builder- Klasse . Wir müssen einer Namenskonvention folgen. Wenn der Klassenname also Person lautet , sollte die Builder- Klasse PersonBuilder heißen .

  2. Die Builder- Klasse muss über einen öffentlichen Konstruktor mit allen erforderlichen Feldern als Parameter verfügen.

  3. Die Builder- Klasse muss über Methoden zum Festlegen der optionalen Parameter verfügen und nach dem Festlegen des optionalen Felds dasselbe Builder- Objekt zurückgeben .

  4. Der letzte Schritt besteht darin, eine build()- Methode in der Builder- Klasse bereitzustellen , die das vom Client-Programm benötigte Objekt zurückgibt. Dazu benötigen wir einen privaten Konstruktor in der Hauptklasse mit der Builder- Klasse als Argument.

Beispiel:

Schauen wir uns ein Beispiel an, um ein klares Verständnis des Builder- Entwurfsmusters zu erhalten .
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();
    }
}
Beispiel für ein Builder- Muster : java.lang.StringBuilder und java.lang.StringBuffer verwendeten das Builder- Muster zum Erstellen von Objekten.

Wie Serialisierung und Deserialisierung in Java funktionieren

Quelle: Medium Ich bin im Januar dieses Jahres nach einem Praktikum zu Java gewechselt. Davor habe ich hauptsächlich in PHP und ein wenig JavaScript geschrieben. Ich war noch nie zuvor auf Serialisierung gestoßen, obwohl es sie tatsächlich in PHP gibt. Es stimmt, in Java wird es viel häufiger verwendet. Heute stelle ich Ihnen vor, wie Serialisierung und Deserialisierung in Java funktionieren und wie Sie sie auf verschiedene Arten nutzen können.

Was ist Serialisierung und Deserialisierung?

Bei der Serialisierung handelt es sich um die Umwandlung eines Objekts aus einer Klasse in eine Bytefolge in der Java Virtual Machine (JVM) zur Übertragung an eine andere Java Virtual Machine. Wenn die Java Virtual Machine ein Objekt aus Bytes neu erstellt, wird der Vorgang Deserialisierung genannt.

Beispiel für Serialisierung und Deserialisierung

Serialisierung

Erstellen wir eine Klasse, deren Objekt serialisiert wird:
import java.io.*;

public class Person implements Serializable{

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

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
Die Person- Klasse implementiert Serializable , sodass ihr Objekt serialisiert/deserialisiert werden kann. Die Person- Klasse verfügt über zwei Felder: Bezeichner und Name, deren Standardwert sich ändert, wenn eine Instanz der Klasse erstellt wird. Die serialisierbare Schnittstelle und andere im Programm verwendete Klassen wurden in das Java.io- Paket importiert.
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();
}
}
}
Wie Sie wissen, startet die Hauptmethode die Serialisierung und gibt eine Erfolgsmeldung aus, andernfalls wird eine Fehlermeldung ausgegeben. Um Objekte zu serialisieren, verwenden wir ObjectOutputStream und die writeObject- Methode .

Deserialisierung

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();
}
}
}
Deserialisierung ist die Umkehrung der Serialisierung. Um ein Objekt aus einer Bytefolge zu rekonstruieren, verwenden Sie ObjectInputStream und die readObject- Methode . Beachten Sie, dass das Objekt in den Datentyp „Person“ umgewandelt wird, um Zugriff auf Felder in der Klasse „ Person“ zu ermöglichen . Ein Klassenobjekt, das die Serialisierungsschnittstelle nicht implementiert, kann nicht serialisiert werden. Daher muss jede Klasse, die auf eine Klasse verweist, die eine Serialisierungsschnittstelle implementiert, selbst die Serialisierungsschnittstelle implementieren, andernfalls wird eine Ausnahme ausgelöst. Die Serialisierung ist plattformunabhängig, was bedeutet, dass der zu serialisierende Bytestrom von einer anderen Java Virtual Machine deserialisiert werden kann. Statische und transiente Felder sind nicht serialisierbar. Wenn Sie also ein Feld haben, das Sie nicht serialisieren möchten, machen Sie es temporär oder statisch. Im Falle eines statischen Felds wird es nicht serialisiert, da ein statisches Feld zu einer Klasse und nicht zu einem Objekt gehört. Aus diesem Grund verhindert der Übergangsstatus, dass das Feld serialisiert wird. Serialisierung wird in Hibernate, JPA und RMI verwendet. Auch die Serialisierung kann individuell angepasst werden. Dies wird als benutzerdefinierte Serialisierung bezeichnet.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION