JavaRush /Java Blog /Random-TW /喝咖啡休息#124。生成器設計模式。Java 中的序列化和反序列化如何運作

喝咖啡休息#124。生成器設計模式。Java 中的序列化和反序列化如何運作

在 Random-TW 群組發布

Java 中的建構器設計模式

來源:Medium 在本文中,我們將學習如何使用Builder設計模式來設計和建立類別的物件。 喝咖啡休息#124。 生成器設計模式。 Java 中的序列化和反序列化如何運作 - 1

為什麼我們需要Builder設計模式?

Builder模式旨在使用與外部類別具有相同資料欄位的嵌套公共靜態類別來建立物件。建立Builder模式是為了解決當類別物件包含許多欄位值和/或資料時工廠抽象工廠設計模式中出現的問題。在我們繼續討論Builder模式之前,讓我們先看看對於物件具有多個欄位值的場景,FactoryAbstract Factory模式會出現哪些問題:
  1. 從客戶端程式傳遞到Factory類別的參數太多可能會導致錯誤,因為大多數時候參數類型是相同的,而且很難在客戶端維護參數的順序。

  2. 有些參數可能是可選的,但在工廠模式中我們被迫發送所有參數,並且可選參數必須作為NULL檔案發送。

  3. 如果物件很「重」且設計複雜,那麼所有這些困難都將成為工廠類別的一部分,這往往會導致混亂。

當物件有大量參數時,可以解決上述問題。為此,您只需為建構函式提供所需的參數,然後提供各種setter方法來設定可選參數。請注意,此方法的問題在於,除非明確設定所有屬性,否則 物件的狀態將保持不一致。

什麼是建構器設計模式?

Builder模式透過提供一種逐步建構物件的方法,解決了可選參數較多和狀態不一致的問題。這使用了一個實際傳回最終物件的方法。

如何在Java中實現Builder設計模式?

如果我們按照以下步驟操作,我們將獲得創建物件和檢索物件的逐步過程:
  1. 建立一個靜態嵌套類別作為Builder類,然後將外部類別中的所有欄位複製到Builder類別中。我們必須遵循命名約定,因此如果類別名稱是Person,那麼Builder類別應該稱為PersonBuilder

  2. Builder類別必須有一個公共建構函數,並將所有必需欄位作為參數。

  3. Builder類別必須具有設定可選參數的方法,並且在設定可選欄位後必須傳回相同的Builder物件。

  4. 最後一步是在Builder類別中提供build()方法,該方法將傳回客戶端程式所需的物件。為此,我們需要在主類別中有一個私有建構函數,並將Builder類別作為參數。

例子:

讓我們看一個範例來清楚地了解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();
    }
}
範例Builder模式:java.lang.StringBuilderjava.lang.StringBuffer使用Builder模式建構物件。

Java 中的序列化和反序列化如何運作

資料來源:Medium 我在實習結束後於今年 1 月轉向了 Java。在此之前,我主要使用 PHP 和少量 JavaScript 編寫。我以前從未遇到過序列化,儘管 PHP 中確實存在序列化。確實,在 Java 中它的使用頻率要高得多。今天我將向您介紹Java中序列化和反序列化的工作原理以及幾種使用方法。

什麼是序列化和反序列化

序列化是將物件從類別轉換為 Java 虛擬機器 (JVM) 中的位元組序列,以便傳輸到另一個 Java 虛擬機器。如果Java虛擬機器從位元組重新建立對象,則該過程稱為反序列化。

序列化和反序列化範例

序列化

讓我們創建一個類,其物件將被序列化:
import java.io.*;

public class Person implements Serializable{

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

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
Person 類別實作了Serialized,以便其物件可以序列化/反序列化。Person類別有兩個欄位:標識符和名稱,在建立該類別的實例時,它們的預設值會發生變化。程式中使用的 Serialized介面和其他類別都被匯入到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();
}
}
}
如您所知,main 方法啟動序列化並列印成功訊息,否則列印錯誤訊息。為了序列化對象,我們使用ObjectOutputStreamwriteObject方法。

反序列化

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();
}
}
}
反序列化是序列化的逆過程。若要從位元組序列重建對象,請使用ObjectInputStreamreadObject方法。請注意,為了提供對Person類別中欄位的訪問,該物件將轉換為Person資料類型。未實現序列化介面的類別物件無法序列化。因此,任何引用實現序列化接口的類別的類別本身都必須實現序列化接口,否則將引發異常。序列化與平台無關,這意味著正在序列化的位元組流可以由另一個 Java 虛擬機器反序列化。靜態和瞬態字段不可序列化,因此如果您有不想序列化的字段,請將其設為臨時或靜態。對於靜態字段,它不會被序列化,因為靜態字段屬於類別而不是物件。因此,過渡狀態會阻止欄位被序列化。序列化用於 Hibernate、JPA 和 RMI。序列化也可以客製化。這稱為自訂序列化。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION