View difference between Paste ID: ipVL8ipX and
SHOW: | | - or go back to the newest paste.
1-
1+
/**
2
 * Example of an immutable pojo with a built-in builder. (getters left out for brevity)
3
 * Admittedly most of the ugliness comes from the syntactic cruft of Java's way of doing closures
4
 * and the lack of method aliases. Scala translation is here: http://pastebin.com/TASbJC5y
5
 * I think this kind of builder could be automatically generated by a compile-time tool - for
6
 * my next trick I'll write one.
7
 * @author twitter.com/benhardy
8
 */
9
public final class PersonFeatures {
10
    public final int userId;
11
    public final int age;
12
    public final int children;
13
    public final int dogs;
14
15
    private PersonFeatures(int userId, int age, int children, int dogs) {
16
        this.userId = userId;
17
        this.age = age;
18
        this.children = children;
19
        this.dogs = dogs;
20
    }
21
22
    // give each stage of the builder only one callable method,
23
    // which returns the next stage
24
25
    public interface BuilderUserIdSpec {
26
        public BuilderAgeSpec userId(int v);
27
    }
28
    public interface BuilderAgeSpec {
29
        public BuilderChildrenSpec age(int v);
30
    }
31
    public interface BuilderChildrenSpec {
32
        public BuilderDogsSpec children(int v);
33
    }
34
    public interface BuilderDogsSpec {
35
        public BuilderFinal dogs(int v);
36
    }
37
    public interface BuilderFinal {
38
        public PersonFeatures build();
39
    }
40
41
    /* the builder method returns its first stage which allows you to set userId, and so on */
42
43
    public static BuilderUserIdSpec builder() {
44
        return new BuilderUserIdSpec() {
45
            @Override public BuilderAgeSpec userId(final int _userId) {
46
                 return new BuilderAgeSpec() {
47
                     @Override public BuilderChildrenSpec age(final int _age) {
48
                         return new BuilderChildrenSpec() {
49
                             @Override public BuilderDogsSpec children(final int _children) {
50
                                 return new BuilderDogsSpec() {
51
                                     public BuilderFinal dogs(final int _dogs) {
52
                                         return new BuilderFinal() {
53
                                            @Override public PersonFeatures build() {
54
                                                return new PersonFeatures(_userId, _age, _children, _dogs);
55
                                            }
56
                                         };
57
                                     }
58
                                 };
59
                             }
60
                         };
61
                     }
62
                 };
63
            }
64
        };
65
    }
66
    
67
    /** 
68
     * example usage. pretty obvious what is going on. only one way to do it. IDE will help.
69
     */
70
    public static void main(String[]args) {
71
        PersonFeatures person = PersonFeatures.builder().userId(4437).age(22).children(0).dogs(1).build();
72
    }
73
}