-
-
Save isicju/77987f16f55d056d1e0f4a1de7ebf491 to your computer and use it in GitHub Desktop.
Builder with mandatory fields, compile time safe
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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