Skip to content

Instantly share code, notes, and snippets.

@isicju
Created December 6, 2021 21:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isicju/77987f16f55d056d1e0f4a1de7ebf491 to your computer and use it in GitHub Desktop.
Save isicju/77987f16f55d056d1e0f4a1de7ebf491 to your computer and use it in GitHub Desktop.
Builder with mandatory fields, compile time safe
package com.example.demo.model;
import java.util.concurrent.atomic.AtomicInteger;
public class Builder {
public static void main(String[] args) {
ValidUser validUser = new Builder().builder()
.name("name")
.age(12)
.build();
}
private String name;
private AtomicInteger age;
private NameSetter nameSetter;
public Builder builder() {
this.name = "";
this.age = new AtomicInteger();
AgeSetter ageSetter = new AgeSetter(this, age);
this.nameSetter = new NameSetter(ageSetter);
return this;
}
public AgeSetter name(String name) {
this.name = name;
return this.nameSetter.getAgeSetter();
}
public ValidUser build() {
return new ValidUser(this.name, this.age);
}
public static class NameSetter {
private final AgeSetter ageSetter;
public NameSetter(AgeSetter ageSetter) {
this.ageSetter = ageSetter;
}
public AgeSetter getAgeSetter() {
return ageSetter;
}
}
public static class AgeSetter {
private final Builder builder;
private final AtomicInteger age;
public AgeSetter(Builder builder, AtomicInteger age) {
this.builder = builder;
this.age = age;
}
public Builder age(int age) {
this.age.set(age);
return this.builder;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment