Required arguments with a Lombok @Builder

前端 未结 9 2490
天涯浪人
天涯浪人 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条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-12 16:16

    The simpliest solution is to add a @lombok.NonNull to all mandatory values. The Builder will fail to build the object when mandatory fields are not set.

    Here's a JUnit test to demonstrate the behavior of all combinations of final and @NonNull:

    import static org.junit.Assert.fail;
    
    import org.junit.Test;
    
    import lombok.Builder;
    import lombok.ToString;
    
    public class BuilderTests {
        @Test
        public void allGiven() {
            System.err.println(Foo.builder()
                .nonFinalNull("has_value")
                .nonFinalNonNull("has_value")
                .finalNull("has_value")
                .finalNonNull("has_value")
                .build());
        }
    
        @Test
        public void noneGiven() {
            try {
                System.err.println(Foo.builder()
                    .build()
                    .toString());
                fail();
            } catch (NullPointerException e) {
                // expected
            }
        }
    
        @Test
        public void nonFinalNullOmitted() {
            System.err.println(Foo.builder()
                .nonFinalNonNull("has_value")
                .finalNull("has_value")
                .finalNonNull("has_value")
                .build());
        }
    
        @Test
        public void nonFinalNonNullOmitted() {
            try {
                System.err.println(Foo.builder()
                    .nonFinalNull("has_value")
                    .finalNull("has_value")
                    .finalNonNull("has_value")
                    .build());
                fail();
            } catch (NullPointerException e) {
                // expected
            }
        }
    
        @Test
        public void finalNullOmitted() {
            System.err.println(Foo.builder()
                .nonFinalNull("has_value")
                .nonFinalNonNull("has_value")
                .finalNonNull("has_value")
                .build());
        }
    
        @Test
        public void finalNonNullOmitted() {
            try {
                System.err.println(Foo.builder()
                    .nonFinalNull("has_value")
                    .nonFinalNonNull("has_value")
                    .finalNull("has_value")
                    .build());
                fail();
            } catch (NullPointerException e) {
                // expected
            }
        }
    
        @Builder
        @ToString
        private static class Foo {
            private String nonFinalNull;
    
            @lombok.NonNull
            private String nonFinalNonNull;
    
            private final String finalNull;
    
            @lombok.NonNull
            private final String finalNonNull;
        }
    }
    

提交回复
热议问题