lombok有"PostConstruct"的功能吗?
Is there any "PostConstruct" feature of lombok?
有没有办法用 lombok 定义“PostConstruct”初始化方法?
@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();
还没有。 an open issue 的名字和你的问题一样。不幸的是,Lombok 的开发相当缓慢,并且有许多功能请求未完成。如果您真的很在意,请为这个投票(不要添加“+1”,使用按钮)。
由于 @PostConstruct is still an open issue and similar questions 弹出,我想建议一个解决方法,如果您遇到以下任何问题,可以遵循该解决方法:
- 你绝对不想做所有的
this.x=x
并用 lombok 替换下面形式的所有此类构造函数。
public SomeClass(A a, B b, C c,.............) {
this.a = a;
this.b = b;
this.c = c;
........
........
someInitLogic();
}
someInitLogic()
是一个新方法,class 是 API 的一部分,或者有很多地方调用了构造函数。所以你不想在调用者中强制更改任何代码。
对于遇到上述问题的任何人,我建议采用以下解决方法:
向您的 class 添加一个虚拟 final
变量。如果 class 是 Serializable
.
,则设为 transient
@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
可用后立即轻松重构。
有没有办法用 lombok 定义“PostConstruct”初始化方法?
@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();
还没有。 an open issue 的名字和你的问题一样。不幸的是,Lombok 的开发相当缓慢,并且有许多功能请求未完成。如果您真的很在意,请为这个投票(不要添加“+1”,使用按钮)。
由于 @PostConstruct is still an open issue and similar questions 弹出,我想建议一个解决方法,如果您遇到以下任何问题,可以遵循该解决方法:
- 你绝对不想做所有的
this.x=x
并用 lombok 替换下面形式的所有此类构造函数。public SomeClass(A a, B b, C c,.............) { this.a = a; this.b = b; this.c = c; ........ ........ someInitLogic(); }
someInitLogic()
是一个新方法,class 是 API 的一部分,或者有很多地方调用了构造函数。所以你不想在调用者中强制更改任何代码。
对于遇到上述问题的任何人,我建议采用以下解决方法:
向您的 class 添加一个虚拟
,则设为final
变量。如果 class 是Serializable
.transient
@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
可用后立即轻松重构。