有没有办法可以定义一个" 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();
答案 0 :(得分:9)
还没有。 an open issue就像您的问题一样命名。不幸的是,Lombok开发速度相当慢,并且有许多功能请求打开。投票给这一个(不要添加“+1”,使用按钮),如果你真的在乎。
答案 1 :(得分:0)
由于 @PostConstruct 仍然是一个悬而未决的问题并且类似的 questions 已经出现,我想建议一个解决方法,如果您遇到以下任何问题,可以遵循该解决方法:
this.x=x
并替换以下形式的所有此类构造函数并使用 lombok。
public SomeClass(A a, B b, C c,.............) {
this.a = a;
this.b = b;
this.c = c;
........
........
someInitLogic();
}
someInitLogic()
是一个新方法,该类是 API 的一部分,或者有很多地方正在调用构造函数。因此,您不希望在调用方中强制更改任何代码。对于任何有上述问题的人,我建议如下解决方法:
向您的类添加一个虚拟 final
变量。如果 class 为 transient
,则设为 Serializable
。
@Getter(value = AccessLevel.NONE)
private final transient boolean dummy;
将 @AllArgsConstructor
或 @RequiredArgsConstructor
中的访问级别设为 private(即使您使用 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
可用时轻松重构。