1

I have Person class that has a reference type field of its inner class Address.

When instantiate a Person object I want to use method-chaining tactic and builder pattern via Lombok's @Builder like below.

class PersonTest {

    @Test
    void builder() {
        Person.builder()
                .name("James")
                .addressBuilder()
                    .cityName("Seoul")
                    .zipCode("16814")
                .buildAddress()
                .build();
    }
}

I was looking for any tricks from the Lombok docs and stackoverflow to use builder-pattern like above, but I couldn't

So I added some methods to the builder classes like below, and with my intellij it shows no error.


@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Person {
    private String name;
    private Address address;

    public static class PersonBuilder {
        public Address.AddressBuilder addressBuilder(){
            return new Address.AddressBuilder(this);
        }
    }


    @Builder
    @AllArgsConstructor(access = AccessLevel.PRIVATE)
    private static class Address {
        private String cityName;
        private String zipCode;

        public static class AddressBuilder{
            private PersonBuilder personBuilder;
            private AddressBuilder(PersonBuilder personBuilder){
                this.personBuilder=personBuilder;
            }
            public PersonBuilder buildAddress(){
                return personBuilder.address(this.build());
            }
        }
    }
}

However, when running the test code, there is a build error saying,

java: constructor AddressBuilder in class com.sample.entity.Person.Address.AddressBuilder cannot be applied to given types; required: com.sample.entity.Person.PersonBuilder found: no arguments reason: actual and formal argument lists differ in length

I wish to find any solution to this build error, or if possible a graceful way to use method-chain like above.

Kiwon Seo
  • 69
  • 5
  • in AddressBuilder you have a private constructor, that might cause the error. I don't think it's a good idea in general to have such kind of builders chain. To my opinion it makes things overcomplicated, you can simply construct instance of Address separately or inside Person's address() method like: `Person.builder().name("James").address(Person.Address.builder()......build()).build(); ` – SergeiTonoian Feb 19 '21 at 09:45
  • After I swithced the constructor to `public` and even the lombok constructor annotation to `@AllArgsConstructor(access = AccessLevel.PUBLIC)` it still shows same error – Kiwon Seo Feb 21 '21 at 23:29

0 Answers0