是否有任何" PostConstruct" lombok的特点?

时间:2016-12-15 03:34:27

标签: lombok

有没有办法可以定义一个" PostConstruct"用lombok初始化方法?

@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();

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:0)

由于 @PostConstruct 仍然是一个悬而未决的问题并且类似的 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() 是一个新方法,该类是 API 的一部分,或者有很多地方正在调用构造函数。因此,您不希望在调用方中强制更改任何代码。

对于任何有上述问题的人,我建议如下解决方法:

  1. 向您的类添加一个虚拟 final 变量。如果 class 为 transient,则设为 Serializable

    @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 可用时轻松重构。