2017-11-17 14 views
2

私はかなり新しいJavaです。誰か私に説明することができますlombok@Builderコンストラクタコールの代わりにオブジェクトを作成するのを使用する利点は?lombok @Builderとコンストラクタ

MyObject o1 = MyObject.builder() 
       .id(1) 
       .name("name") 
       .build(); 

MyObject o2 = new MyObject(1, "name") 

可視性が向上するのは単なる質問ですか?

+4

"可視性"ではなく "可読性"ではありません。そして、理論的には、ビルダーでもっと多くのことを行うことができます。なぜなら、ハーフで初期化されたビルダーを渡すことができるからです。 – luk2302

+2

しかし、ビルダーには欠点があります。すべての必須パラメータを指定する必要はありません。たとえば、コードをリファクタリングしてコンストラクタに必須パラメータを追加すると、ビルダー呼び出し側でコンパイルエラーが発生することはありませんが、実行時にエラーが発生します。 – Joel

+1

半初期化されたビルダーを注意深く渡します。彼らは変更可能です。ロンボクを最初に使用する大きな理由は、不変のオブジェクトです。 – slim

答えて

3

これはロンボク島特有の機能ではありませんが、これはbuilder pattern.

あなたは20個のパラメータを持つクラスを持っている想像と呼ばれ、そのうちの10はオプションです。あなたは何とかこの論理を世話してくれるたくさんのコンストラクタを作ったり、それらの引数をすべて使ってコンストラクタを作ったり、いくつかの場所でnullを渡すことができます。ビルダーパターンは単純に簡単ではありませんか?

+0

ここでは、クラスには1つの責任があります。ほとんどの場合、それは20のパラメータを持つこととは一緒には行きません。何かに20のフィールドがある場合は、どちらかと言えば、実際に何かを話しているのか、いくつかの小さなものに分かれているかどうかを確認してください。 – GhostCat

3

は考えてみましょう:

Order order = new Order("Alan", "Smith", 2, 6, "Susan", "Smith"); 

パラメータは何を意味するのですか?見つけ出すコンストラクタの仕様を見なければなりません。ビルダーと今

Order order = Order.builder() 
    .originatorFirstName("Alan") 
    .originatorLastName("Smith") 
    .lineItemNumber(2) 
    .quantity(6) 
    .recipientFirstName("Susan") 
    .recipientLastName("Smith") 
    .build(); 

それはもっと長ったらしいのですが、それは読むことを非常に明確だし、IDEの支援を受けて、それがあまりにも書くのは簡単です。ビルダーそのものはちょっと手間がかかりますが、ロンボクのようなコード生成ツールが役立ちます。

あなたのコードにビルダーが読めるようにする必要がある場合、それは他の匂いを露呈させると主張する人もいます。あまりにも多くの基本タイプを使用しています。あなたは1つのクラスにあまりにも多くのフィールドを入れています。たとえば、考えてみます。

Order order = new Order(
    new Originator("Alan", "Smith"), 
    new ItemSet(new Item(2), 6), 
    new Recipient("Susan", "Smith")); 

...私たちは、シングル責任と少数のフィールドを持つ複数のクラスを使用しているため、ビルダーを使用しなくても自明です。

関連する問題