ビルダーまたはコンストラクター?私たちは大声で推論します

こんにちは!単純なオブジェクトにビルダーを使用することの妥当性について推測したいと思います。



簡単にするために、lombokアノテーションを使用します。



@ Value

@Builder



少しグーグルした後、そのビルダーを取得します-複雑なオブジェクトの構築をその表示から分離して、同じ構築プロセスの結果として異なるビューを取得できるようにします。複雑なオブジェクト専用ですか?



簡単な例を見てみましょう。



@Value
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}


非常に単純なクラス。実際、コンストラクターを介して初期化される不変のオブジェクトを取得します。



しかし、ご覧のとおり、すべてのフィールドはnull可能であり、そのようなオブジェクトの作成はあまり見栄えがよくありません。



        final Info info1 = new Info(null, "email@email.com", "79998888888");
        final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null);
        final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null);
...


確かにオプションがあります:



  1. 異なるタイプのいくつかのフィールドを持つオブジェクトは、いくつかのコンストラクターで配信できます。しかし、それは上記のクラスの問題を解決しません。
  2. セッターの使用は主観的であり、コードが乱雑になります。




ビルダーはどうですか?



@Value
@Builder
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}


単純なオブジェクトの 非常にエレガントな構造が得られます。



        final Info info1 = Info.builder()
                .uuid("3d107928-d225-11ea-87d0-0242ac130003")
                .phone("79998888888")
                .build();
        final Info2 info2 = Info.builder()
                .email("email@email.com")
                .phone("79998888888")
                .build();
...
}


ただし、プロジェクトでjacksonを使用するには、クラスを追加して、正常に逆シリアル化する必要があります。



@Value
@Builder(builderClassName = "InfoBuilder")
@JsonDeserialize(builder = Info.InfoBuilder.class)
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;

    @JsonPOJOBuilder(withPrefix = "")
    public static class InfoBuilder {

    }
}


両方のアプローチの長所と短所を取得します。



ビルダー:



+1

。コードがより簡潔になります。

3.コンストラクタパラメータのnullは目立ちません。

2.同じタイプのパラメーターを混同する可能性が低くなります。

-

1.私たちは、全体としてはGCが安全に削除されることの余分なオブジェクトを作成しますが、あなたはそれを忘れてはなりません。

2.必要に応じて、jacksonを使用します-クラスを積み上げます。



コンストラクター:



+1

。クラスを最小限に積み上げます。水はありません。

2.不要なオブジェクトの作成はありません。

-

1.非常に頻繁にnullは、このようなオブジェクトのコンストラクタに到着します。

2.誰かがコードを変更すると、間違いを犯す可能性があります。



結果



私の経験に基づいて、私はビルダーを使用する傾向があります。コストは高くありませんが、出力は読みやすいコードです。



そしてもちろん、コンストラクターを使用することの2番目の欠点を回避するためのテストを作成します。



PSこれは私の最初の記事です、建設的な批判とコメントに感謝します。



All Articles