Java のビルダー設計パターン
出典: Mediumこの記事では、 Builderデザイン パターン を使用してクラスのオブジェクトをデザインおよび作成する方法を学びます。Builder デザイン パターンが必要な理由は何ですか?
Builderパターンは、外部クラスと同じデータ フィールドを持つネストされたパブリック静的クラスを使用してオブジェクトを作成するように設計されています。Builderパターンは、クラス オブジェクトに多くのフィールド値やデータが含まれている場合に、FactoryおよびAbstract Factoryデザイン パターンに存在する問題を解決するために作成されました。Builderパターンに進む前に、オブジェクトに多くのフィールド値があるシナリオでFactory パターンとAbstract Factoryパターンでどのような問題が発生するかを正確に見てみましょう。-
クライアント プログラムからFactoryクラスに渡す引数が多すぎると、ほとんどの場合引数の型が同じであり、クライアント側で引数の順序を維持することが難しいため、エラーが発生する可能性があります。
-
一部のパラメータはオプションである場合がありますが、Factoryパターンではすべてのパラメータを送信する必要があり、オプションのパラメータはNULLファイルとして送信する必要があります。
-
オブジェクトが「重く」、設計が複雑な場合、これらすべての問題が Factory クラスの一部となり、混乱が生じることがよくあります。
Builder デザイン パターンとは何ですか?
Builderパターンは、オブジェクトを段階的に構築する方法を提供することで、多数のオプションのパラメーターと一貫性のない状態の問題を解決します。これは、実際に最終オブジェクトを返すメソッドを使用します。Java で Builder デザイン パターンを実装するにはどうすればよいですか?
以下の手順に従うと、オブジェクトの作成と取得の段階的なプロセスが表示されます。-
静的にネストされたクラスを Builder クラスとして作成し、すべてのフィールドを外部クラスから Builder クラスにコピーします。命名規則に従う必要があるため、クラス名がPersonの場合、BuilderクラスはPersonBuilderという名前にする必要があります。
-
Builderクラスには、すべての必須フィールドをパラメーターとして持つパブリック コンストラクターが必要です。
-
Builderクラスにはオプションのパラメーターを設定するメソッドが必要であり、オプションのフィールドを設定した後は同じBuilderオブジェクトを返す必要があります。
-
最後のステップは、クライアント プログラムが必要とするオブジェクトを返すbuild()メソッドをBuilderクラスに提供することです。これを行うには、 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();
}
}
ビルダーパターン の例: java.lang.StringBuilderおよびjava.lang.StringBuffer は、ビルダーパターンを使用してオブジェクトを構築しました。
Java でのシリアル化と逆シリアル化の仕組み
出典: Medium 私はインターンシップを経て、今年の 1 月に Java に切り替えました。これまでは、主に PHP と少しの JavaScript で書いていました。実際には PHP にはシリアル化が存在しますが、私はこれまでシリアル化に遭遇したことがありませんでした。確かに、Java ではより頻繁に使用されます。今日は、Java でのシリアル化と逆シリアル化の仕組みと、それらを使用するいくつかの方法を紹介します。シリアル化と逆シリアル化とは何ですか
シリアル化とは、別の Java 仮想マシンに送信するために、Java 仮想マシン (JVM) 内でオブジェクトをクラスからバイトのシーケンスに変換することです。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 クラスはSerializableを実装し、そのオブジェクトをシリアル化/逆シリアル化できるようにします。Personクラスには、識別子と名前という 2 つのフィールドがあります。これらは、クラスのインスタンスが作成されるときにデフォルト値から変更されます。プログラムで使用される Serializableインターフェイスとその他のクラスは、 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 メソッドはシリアル化を開始して成功メッセージを出力します。それ以外の場合はエラー メッセージが出力されます。オブジェクトをシリアル化するには、 ObjectOutputStreamとwriteObjectメソッドを使用します。
逆シリアル化
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();
}
}
}
逆シリアル化はシリアル化の逆です。一連のバイトからオブジェクトを再構築するには、ObjectInputStreamとreadObjectメソッドを使用します。Personクラスのフィールドへのアクセスを提供するために、オブジェクトはPersonデータ型にキャストされることに注意してください。シリアル化インターフェイスを実装していないクラス オブジェクトはシリアル化できません。したがって、シリアル化インターフェイスを実装するクラスを参照するクラスは、それ自体がシリアル化インターフェイスを実装する必要があります。実装しない場合は、例外がスローされます。シリアル化はプラットフォームに依存しません。つまり、シリアル化されているバイト ストリームは別の Java 仮想マシンによって逆シリアル化できます。静的フィールドと一時フィールドはシリアル化できないため、シリアル化したくないフィールドがある場合は、それを一時フィールドまたは静的フィールドにします。静的フィールドの場合、静的フィールドはオブジェクトではなくクラスに属しているため、シリアル化されません。このため、遷移状態によりフィールドがシリアル化されなくなります。シリアル化は Hibernate、JPA、および RMI で使用されます。シリアル化もカスタマイズできます。これはカスタムシリアル化と呼ばれます。
GO TO FULL VERSION