Skip to content

Commit 87a9d47

Browse files
oleksandr-shxpinjection
authored andcommitted
Builder pattern with lambdas (#12)
1 parent 96d0ccb commit 87a9d47

File tree

4 files changed

+183
-0
lines changed

4 files changed

+183
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.xpinjection.java8.good.builder;
2+
3+
/**
4+
* @author Oleksandr Shkurko
5+
*/
6+
public class Sample {
7+
8+
public static void main(String[] args) {
9+
User user = User.builder()
10+
.setId(42)
11+
.setName("Guest")
12+
.setAge(23)
13+
.build();
14+
15+
System.out.println(user);
16+
}
17+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.xpinjection.java8.good.builder;
2+
3+
import java.util.StringJoiner;
4+
5+
/**
6+
* @author Oleksandr Shkurko
7+
*/
8+
public class User {
9+
10+
private Long id;
11+
private String name;
12+
private int age;
13+
14+
private User(Long id, String name, int age) {
15+
this.id = id;
16+
this.name = name;
17+
this.age = age;
18+
}
19+
20+
public static UserBuilderId builder() {
21+
return id -> name -> age -> () -> new User(id, name, age);
22+
}
23+
24+
public Long getId() {
25+
return id;
26+
}
27+
28+
public String getName() {
29+
return name;
30+
}
31+
32+
public int getAge() {
33+
return age;
34+
}
35+
36+
public interface UserBuilderId {
37+
UserBuilderName setId(long id);
38+
}
39+
40+
public interface UserBuilderName {
41+
UserBuilderAge setName(String name);
42+
}
43+
44+
public interface UserBuilderAge {
45+
UserBuilder setAge(int age);
46+
}
47+
48+
public interface UserBuilder {
49+
User build();
50+
}
51+
52+
@Override
53+
public String toString() {
54+
return new StringJoiner(", ", User.class.getSimpleName() + "[", "]")
55+
.add("id=" + id)
56+
.add("name='" + name + "'")
57+
.add("age=" + age)
58+
.toString();
59+
}
60+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.xpinjection.java8.good.builder2;
2+
3+
/**
4+
* @author Oleksandr Shkurko
5+
*/
6+
public class Sample {
7+
8+
public static void main(String[] args) {
9+
User user = User.builder()
10+
.setId(1)
11+
.setName("guest")
12+
.setAge(18)
13+
.addRole("GUEST")
14+
.addRole("LOGIN")
15+
.build();
16+
17+
System.out.println(user);
18+
}
19+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.xpinjection.java8.good.builder2;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
import java.util.StringJoiner;
6+
7+
import static java.util.Collections.unmodifiableSet;
8+
import static java.util.Objects.requireNonNull;
9+
10+
/**
11+
* @author Oleksandr Shkurko
12+
*/
13+
public class User {
14+
private Long id;
15+
private String name;
16+
private int age;
17+
private Set<String> roles;
18+
19+
private User() {
20+
}
21+
22+
public static UserBuilderId builder() {
23+
return id -> name -> age ->
24+
25+
new UserBuilderRoles() {
26+
@Override
27+
public User build() {
28+
User user = new User();
29+
user.id = id;
30+
user.name = requireNonNull(name);
31+
user.age = age;
32+
user.roles = unmodifiableSet(this.roles);
33+
return user;
34+
}
35+
};
36+
}
37+
38+
public Long getId() {
39+
return id;
40+
}
41+
42+
public String getName() {
43+
return name;
44+
}
45+
46+
public int getAge() {
47+
return age;
48+
}
49+
50+
public Set<String> getRoles() {
51+
return roles;
52+
}
53+
54+
public interface UserBuilderId {
55+
UserBuilderName setId(long id);
56+
}
57+
58+
public interface UserBuilderName {
59+
UserBuilderAge setName(String name);
60+
}
61+
62+
public interface UserBuilderAge {
63+
UserBuilderRoles setAge(int age);
64+
}
65+
66+
public static abstract class UserBuilderRoles {
67+
68+
Set<String> roles = new HashSet<>();
69+
70+
public UserBuilderRoles addRole(String role) {
71+
roles.add(requireNonNull(role));
72+
return this;
73+
}
74+
75+
public abstract User build();
76+
}
77+
78+
@Override
79+
public String toString() {
80+
return new StringJoiner(", ", User.class.getSimpleName() + "[", "]")
81+
.add("id=" + id)
82+
.add("name='" + name + "'")
83+
.add("age=" + age)
84+
.add("roles=" + roles)
85+
.toString();
86+
}
87+
}

0 commit comments

Comments
 (0)