Есть ли какая-либо особенность 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 все еще остается открытой проблемой, и возникали похожие вопросы , я хотел бы предложить обходной путь, который можно было бы использовать, если у вас есть какие-либо из следующих проблем:
- Вы определенно не хотите делать все
this.x=x
и замените все такие конструкторы приведенной ниже формы на ломбок.public SomeClass(A a, B b, C c,.............) { this.a = a; this.b = b; this.c = c; ........ ........ someInitLogic(); }
-
someInitLogic()
- это новый метод, а класс является частью API, или существует множество мест, где вызывается конструктор. Таким образом, вы не хотите форсировать какие-либо изменения кода в вызывающих абонентах.
Для тех, у кого есть вышеуказанные проблемы, я предлагаю обходной путь следующим образом:
Добавить манекен
final
переменная к вашему классу. Сделай этоtransient
если классSerializable
.@Getter(value = AccessLevel.NONE) private final transient boolean dummy;
Сделайте уровень доступа в
@AllArgsConstructor
или же@RequiredArgsConstructor
как личное (даже если вы используетеstaticName
), так что конструктор с фиктивным параметром недоступен извне.@RequiredArgsConstructor(staticName = "of",access = AccessLevel.PRIVATE)
или же
@AllArgsConstructor(access = AccessLevel.PRIVATE)
Напишите конструктор или статический метод, соответствующий тому, который в настоящее время вызывается, как показано ниже:
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
доступен.