web-dev-qa-db-ja.com

lombokを使用して既存のオブジェクトからオブジェクトを構築する

のようなロンボク注釈付きクラスがあるとしましょう

@Builder
class Band {
   String name;
   String type;
}

私ができることを知っています:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();

既存のオブジェクトをテンプレートとして使用し、そのプロパティの1つを変更するFooのオブジェクトを簡単に作成する方法はありますか?

何かのようなもの:

Band nirvana = Band.builder(rollingStones).name("Nirvana");

これはロンボクのドキュメントにはありません。

55
Mustafa

toBuilderパラメーターを使用して、インスタンスにtoBuilder()メソッドを与えることができます。

@Builder(toBuilder=true)
class Foo {
   int x;
   ...
}

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();

ドキュメント から:

@Builderを使用してビルダーを生成して独自のクラスのインスタンスを生成する場合(独自の型を返さないメソッドに@Builderを追加しない限り、これは常に当てはまります)、@ Builder(toBuilder = true)を使用して生成することもできますクラス内のtoBuilder()というインスタンスメソッド。このインスタンスのすべての値で始まる新しいビルダーを作成します。

免責事項:私はロンボク島の開発者です。

116
Roel Spilker

既存のオブジェクトをテンプレートとして使用し、そのプロパティのoneを変更するFooのオブジェクトを作成する簡単な方法はありますか? (エンファシス鉱山

単一のプロパティを本当に変更したい場合は、より優れた効率的な方法があります。

@Wither
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

ウィザーはゴミを作成しませんが、1つのフィールドのみを変更できます。多くのフィールドを変更するには、使用できます

withA(a).withB(b).withC(c)....

大量のゴミ(すべて中間結果)を生成しますが、toBuilderよりも効率的で自然です。

24
maaartinus