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 弹出,我想建议一个解决方法,如果您遇到以下任何问题,可以遵循该解决方法:

  1. 你绝对不想做所有的 this.x=x 并用 lombok 替换下面形式的所有此类构造函数。
    public SomeClass(A a, B b, C c,.............) {
        this.a = a;
        this.b = b;
        this.c = c;
        ........
        ........
        someInitLogic();
    }
    
  2. someInitLogic() 是一个新方法,class 是 API 的一部分,或者有很多地方调用了构造函数。所以你不想在调用者中强制更改任何代码。

对于遇到上述问题的任何人,我建议采用以下解决方法:

  1. 向您的 class 添加一个虚拟 final 变量。如果 class 是 Serializable.

    ,则设为 transient
    @Getter(value = AccessLevel.NONE)
    private final transient boolean dummy;
    
  2. @AllArgsConstructor@RequiredArgsConstructor 中的访问级别设置为 private(即使您使用 staticName) , 这样带有伪参数的构造函数在外部是不可访问的。

    @RequiredArgsConstructor(staticName = "of",access = AccessLevel.PRIVATE)
    

    @AllArgsConstructor(access = AccessLevel.PRIVATE)
    
  3. 编写一个与当前正在调用的方法相匹配的构造函数或静态方法,如下所示:

    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 可用后立即轻松重构。