簡単にするために、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);
...
確かにオプションがあります:
- 異なるタイプのいくつかのフィールドを持つオブジェクトは、いくつかのコンストラクターで配信できます。しかし、それは上記のクラスの問題を解決しません。
- セッターの使用は主観的であり、コードが乱雑になります。
ビルダーはどうですか?
@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これは私の最初の記事です、建設的な批判とコメントに感謝します。