This generates a "telescoping" builder where every field must be filled, otherwise it's a compiler error.
To generate the builder, annotate a record class with @RecordBuilder
@RecordBuilder
record Message(
String sender,
String body,
String recipient
) {
}The generated class will be called MessageBuilders.
@Generated
final class MessageBuilders {
static SenderStep builder()
static MessageUpdater builder(Message message)
interface SenderStep { BodyStep sender(String sender) }
interface BodyStep { RecipientStep body(String body) }
interface RecipientStep { HasBuildMethod<Message> recipient(String recipient) }
private static class MessageBuilder implements SenderStep, BodyStep, RecipientStep, HasBuildMethod<Message> {
@Override BodyStep sender(String sender)
@Override RecipientStep body(String body)
@Override HasBuildMethod<Message> recipient(String recipient)
@Override Message build()
}
static final class MessageUpdater {
MessageUpdater sender(String sender)
MessageUpdater body(String body)
MessageUpdater recipient(String recipient)
Message build()
}
}similar project: https://github.com/DanielLiu1123/recordbuilder