Пользовательский сеттер и конструктор с помощником stati c в Ломбоке - PullRequest
0 голосов
/ 11 марта 2020

Я хочу использовать пользовательский установщик и конструктор с помощником stati c в Lombok:

@SuperBuilder(toBuilder = true)
public class Teacher extends User {
}


@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(NON_NULL)
public class User implements Employee {
    private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();

    private String username;
    private String password;

    User(String username, String password) {
        System.out.println("*** test ***");

    }
}

, но когда я создаю объект Teacher, кажется, что конструктор не вызывается, потому что я не вижу тестовое сообщение в консоли

Teacher.builder()
 .username("username").password("pwd").build();

1 Ответ

0 голосов
/ 11 марта 2020

Смысл паттерна Builder - почти всегда возвращать неизменный объект из объекта Builder, который по своей природе изменчив. Помощник stati c, на который вы ссылаетесь, - это метод фабрики шаблонов Builder, используемый для создания объекта User. Вам не нужно создавать сеттер для пользователя, вместо этого пользователь не должен определяться с @Data.

Если вам нужно вызвать какой-либо метод после создания объекта User или Employee, просто добавьте функцию в соответствующий класс и вызовите ее после создания. Скрытие работы внутри конструктора, кроме инициализации членов класса, может быть опасным, потому что вы скрываете функциональность и если это закрытый метод, функциональность не может быть переопределена.

    @SuperBuilder(toBuilder = true)
    public static class Teacher extends User {

    }

    @AllArgsConstructor
    @SuperBuilder(toBuilder = true)
    public static class User implements Employee {

        private final String username;

        private final String password;
    }

    public static void main(String[] args) {
        Teacher teacher = Teacher.builder()
                .username("username").password("pwd").build();

        System.out.println(teacher.toString());
    }

    interface Employee {

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...