Ruby (Rails) プログラマーとして 2 年間、Java を使用する別のチームに切り替えたばかりです。Java ビルダー パターンについて質問があります。
このパターンを使用する利点、つまりテレスコーピング コンストラクターと一貫性のない状態を作成する Java Bean セッターを回避することの利点は理解していますが、それがどのように機能するかを正確に理解するのに苦労しています。チームが使用する必要がある正確なパターンは次のとおりです。
public class Person
{
//why is it so important that this be final, hence immutable
private final String firstName;
private final String lastName;
// Constructor
public Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
//I have absolutely no idea what is this for and why is this necessary
public static Builder builder()
{
return new Builder();
}
//This is an inner class, where person is the outer class (the owning class)
//but why is this has to be a static class?
public static class Builder
{
private String firstName;
private String lastName;
public Builder withFirstName(String firstName)
{
//this.firstName refers to the Builder instance firstName
this.firstName = firstName;
return this;
//what is this return this? returning this instance of the Builder object?
}
public Builder withLastName(String lastName)
{
this.lastName = lastName;
return this;
}
public Person build()
{
return new Person(firstName, lastName);
//firstName and lastName here refer to the Builder's object instance vars,
//and used to create a new person object
}
}
}
使用するには:
Person p = new Person.Builder(5).firstName("foo").lastName("bar").build();
1) Builder のパラメータ「5」は何ですか?
2) Builder の内部クラスが静的なのはなぜですか?
3) public static Builder builder() メソッドの使用は何ですか?
4) 実際に新しい内部クラス (Builder オブジェクト) を作成していることは正しいですか? この内部クラス内のビルド メソッドは新しい Person オブジェクトを返しますか?
5) この Person クラスを作成するには、外部クラス用と内部クラス用の 2 倍のメモリ使用量が必要になるようですが、効率が悪いのでしょうか?
6) Person p = new Person("foo", "bar"); によって新しい人物オブジェクトを作成できることは正しいですか?
7) 誰かがこれをどのように単体テストしますか? セッターとゲッターを単体テストする方法は?
8) どのフィールドでもバリデーションを実行できますか?
9) フィールドが必須であることを指定するにはどうすればよいですか。誰かが firstName のみで lastName が指定されていないフィールドを構築しようとすると、例外がスローされます。
よろしくお願いします!