Есть ли какая-либо особенность PostConstruct в lombok?

Есть ли способ, которым я могу определить метод инициализации "PostConstruct" с помощью lombok?

@RequiredArgsConstructor(staticName = "of")
class MyObj {
    private final int x;
    private final int y;

    private int z;

    // not work
    @PostConstruct
    private void someInitLogic {
        z = x + y;
    }

    public void start() {
        // code use "z"
    }
}

Так что я могу инициировать объект как:

MyObj obj = MyObj.of(1, 2);
obj.start();

2 ответа

Решение

Еще нет. Есть открытый вопрос, названный так же, как ваш вопрос. К сожалению, разработка Lombok довольно медленная, и есть много открытых запросов. Проголосуйте за это (не добавляйте "+1", используйте кнопку), если вам действительно интересно.

Поскольку @PostConstruct все еще остается открытой проблемой, и возникали похожие вопросы , я хотел бы предложить обходной путь, который можно было бы использовать, если у вас есть какие-либо из следующих проблем:

  1. Вы определенно не хотите делать все this.x=x и замените все такие конструкторы приведенной ниже формы на ломбок.
            public SomeClass(A a, B b, C c,.............) {
        this.a = a;
        this.b = b;
        this.c = c;
        ........
        ........
        someInitLogic();
    }
    
  2. someInitLogic()- это новый метод, а класс является частью API, или существует множество мест, где вызывается конструктор. Таким образом, вы не хотите форсировать какие-либо изменения кода в вызывающих абонентах.

Для тех, у кого есть вышеуказанные проблемы, я предлагаю обходной путь следующим образом:

  1. Добавить манекен finalпеременная к вашему классу. Сделай это transient если класс Serializable.

            @Getter(value = AccessLevel.NONE)
    private final transient boolean dummy;
    
  2. Сделайте уровень доступа в @AllArgsConstructor или же @RequiredArgsConstructorкак личное (даже если вы используете staticName), так что конструктор с фиктивным параметром недоступен извне.

            @RequiredArgsConstructor(staticName = "of",access = AccessLevel.PRIVATE)
    

    или же

            @AllArgsConstructor(access = AccessLevel.PRIVATE)
    
  3. Напишите конструктор или статический метод, соответствующий тому, который в настоящее время вызывается, как показано ниже:

            public MyClass(A a, B b, C c,.......) {
        this(a,b,c,......, false /* dummy*/);
        someInitLogic();
    }
    

    Или если вы использовали static метод для вызова конструктора:

            public static MyClass of(A a, B b,......) {
        MyClass obj = MyClass.of(a,b,......, false /* dummy*/);
        obj.someInitLogic();
        return obj;
    }
    

Таким образом, вы можете уменьшить код стандартной пластины, но в то же время не вызовете никаких изменений кода в вызывающих объектах и ​​сможете легко провести рефакторинг, как только @PostConstruct доступен.

Другие вопросы по тегам