Required arguments with a Lombok @Builder

前端 未结 9 2488
天涯浪人
天涯浪人 2020-12-12 15:17

If I add @Builder to a class. The builder method is created.

Person.builder().name(\"john\").surname(\"Smith\").build();

I have a requirem

9条回答
  •  天涯浪人
    2020-12-12 16:14

    This is my solution for the problem

    import lombok.Builder;
    import lombok.Data;
    import lombok.NonNull;
    
    @Data
    @Builder(builderMethodName = "privateBuilder")
    public class Person {
        @NonNull
        private String name;
        @NonNull
        private String surname;
        private int age;//optional
    
    public static Url safeBuilder() {
        return new Builder();
    }
    
    interface Url {
        Surname name(String name);
    }
    
    interface Surname {
        Build surname(String surname);
    }
    
    interface Build {
        Build age(int age);
        Person build();
    }
    
    public static class Builder implements Url, Surname, Build {
        PersonBuilder pb = Person.privateBuilder();
    
        @Override
        public Surname name(String name) {
            pb.name(name);
            return this;
        }
    
        @Override
        public Build surname(String surname) {
            pb.surname(surname);
            return this;
    
        }
    
        @Override
        public Build age(int age) {
            pb.age(age);
            return this;
        }
    
        @Override
        public Person build() {
            return pb.build();
        }
        }
    }
    

    inspired by this blog post:

    https://blog.jayway.com/2012/02/07/builder-pattern-with-a-twist/

提交回复
热议问题