lombok有"PostConstruct"功能吗?

Jok*_*oka 3 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以初始化一个对象:

MyObj obj = MyObj.of(1, 2);
obj.start();
Run Code Online (Sandbox Code Playgroud)

maa*_*nus 10

还没.有一个开放的问题,就像你的问题一样.不幸的是,Lombok开发速度相当慢,并且有许多功能请求打开.投票给这一个(不要添加"+1",使用按钮),如果你真的在乎.


Gau*_*m M 0

由于@PostConstruct仍然是一个悬而未决的问题,并且已经出现了类似的问题,因此我想建议一个解决方法,如果您遇到以下任何问题,可以遵循该解决方法:

  1. 您绝对不想执行所有操作this.x=x并将以下形式的所有此类构造函数替换为 lombok。
    public SomeClass(A a, B b, C c,.............) {
        this.a = a;
        this.b = b;
        this.c = c;
        ........
        ........
        someInitLogic();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. someInitLogic()是一个新方法,并且该类是 API 的一部分,或者有很多地方正在调用构造函数。因此,您不想强制调用者更改任何代码。

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

  1. final向您的类添加一个虚拟变量。transient如果班级是的话就做吧Serializable

    @Getter(value = AccessLevel.NONE)
    private final transient boolean dummy;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将访问级别设置为@AllArgsConstructor@RequiredArgsConstructor私有(即使您使用staticName),以便外部无法访问带有虚拟参数的构造函数。

    @RequiredArgsConstructor(staticName = "of",access = AccessLevel.PRIVATE)
    
    Run Code Online (Sandbox Code Playgroud)

    或者

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

    public MyClass(A a, B b, C c,.......) {
        this(a,b,c,......, false /* dummy*/);
        someInitLogic();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    或者,如果您使用static方法来调用构造函数:

    public static MyClass of(A a, B b,......) {
        MyClass obj = MyClass.of(a,b,......, false /* dummy*/);
        obj.someInitLogic();
        return obj;
    }
    
    Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以减少样板代码,但同时不会导致调用者发生任何代码更改,并且可以在@PostConstruct可用时轻松重构。