有没有办法在构造期间但在构造函数之后执行方法?

时间:2017-11-08 18:29:03

标签: 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
}

但是我想用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中编码计算不是一个选项(对于一个,它否定了使用@Getter的好处)
  • 这个例子是真实生活类的粗略简化,它有许多final个字段,以及几个计算/派生字段,所以使用lombok节省的样板很多
  • 该类是一个简单的POJO DTO,而不是托管bean,因此没有任何生命周期的javax注释(例如@PostConstruct)都可以使用

1 个答案:

答案 0 :(得分:4)

如何使用lazy option on @Getter进行计算:

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

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