有没有一种方法可以在构造过程中但在构造函数之后执行方法?

Boh*_*ian 7 java constructor initialization lombok

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

但是我想使用lombok生成构造函数和获取方法:

@Getter
@RequiredArgsConstructor
public class MyClass {
    private final int x;
    private int sqrt;
}
Run Code Online (Sandbox Code Playgroud)

为了使计算进入类,您可以考虑一个实例块:

{
    sqrt = (int)Math.sqrt(x);
}
Run Code Online (Sandbox Code Playgroud)

但是实例块是在构造函数中的代码执行之前执行的,因此x尚未初始化。

sqrt = (int)Math.sqrt(x); x分配了构造函数参数后,是否有一种方法可以执行,但仍使用由生成的构造函数RequiredArgsConstructor

笔记:

  • 在getter中对计算进行编码不是一种选择(对于一个方法,它抵消了使用的好处@Getter
  • 此示例是对现实生活类的粗略简化,其中包含许多final字段以及几个计算/派生的字段,因此使用lombok可以节省大量样板
  • 该类是一个简单的POJO DTO,而不是托管Bean,因此生命周期javax注释(例如@PostConstruct)均无用

小智 6

如何使用lazy@Getter上选项进行计算:

// tested and works OK
@Getter(lazy = true) 
private final int sqrt = (int) Math.sqrt(x);
Run Code Online (Sandbox Code Playgroud)

注意:调用getSqrt()按预期/希望的方式工作,触发计算并设置“最终”字段,但是直接访问该字段不会调用魔术-您会获得未初始化的值。