我正在使用lombok并尝试最小化代码。这是我在香草java中的(人为的)情况:
public class MyClass {
private final int x;
private final int sqrt;
public MyClass(int x) {
this.x = x;
sqrt = (int)Math.sqrt(x);
}
// getters, etc
}
但是我想用lombok来生成构造函数和getter:
@Getter
@RequiredArgsConstructor
public class MyClass {
private final int x;
private int sqrt;
}
要将计算放入类中,您可以考虑实例块:
{
sqrt = (int)Math.sqrt(x);
}
但实例块在构造函数执行代码之前执行,因此x
尚未初始化。
在使用构造函数参数分配 sqrt = (int)Math.sqrt(x);
之后是否有办法执行x
,但是仍然使用RequiredArgsConstructor
生成的构造函数?
注意:
@Getter
的好处)final
个字段,以及几个计算/派生字段,所以使用lombok节省的样板很多@PostConstruct
)都可以使用答案 0 :(得分:4)
如何使用lazy
option on @Getter进行计算:
// tested and works OK
@Getter(lazy = true)
private final int sqrt = (int) Math.sqrt(x);
注意:调用getSqrt()
按预期/希望工作,触发计算并设置“最终”字段,但直接访问字段不会调用魔法 - 您将获得未初始化的值。