-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBuilder.java
More file actions
54 lines (42 loc) · 1.6 KB
/
Builder.java
File metadata and controls
54 lines (42 loc) · 1.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.github.lokic.javaplus;
import com.github.lokic.javaplus.functional.consumer.Consumer2;
import com.github.lokic.javaplus.functional.consumer.Consumer3;
import com.github.lokic.javaplus.functional.consumer.Consumer4;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* 对POJO提供的通用builder,也可以作为对POJO提供fluent风格的setter
*/
public class Builder<T> {
private final Supplier<T> instanceSupplier;
private final List<Consumer<T>> modifiers;
private Builder(Supplier<T> instanceSupplier) {
this.instanceSupplier = instanceSupplier;
this.modifiers = new ArrayList<>();
}
public static <T> Builder<T> of(Supplier<T> instanceSupplier) {
return new Builder<>(instanceSupplier);
}
public <P1> Builder<T> with(Consumer2<T, P1> consumer, P1 p1) {
Consumer<T> c = instance -> consumer.accept(instance, p1);
modifiers.add(c);
return this;
}
public <P1, P2> Builder<T> with(Consumer3<T, P1, P2> consumer, P1 p1, P2 p2) {
Consumer<T> c = instance -> consumer.accept(instance, p1, p2);
modifiers.add(c);
return this;
}
public <P1, P2, P3> Builder<T> with(Consumer4<T, P1, P2, P3> consumer, P1 p1, P2 p2, P3 p3) {
Consumer<T> c = instance -> consumer.accept(instance, p1, p2, p3);
modifiers.add(c);
return this;
}
public T build() {
T instance = instanceSupplier.get();
modifiers.forEach(modifier -> modifier.accept(instance));
return instance;
}
}