【问题标题】:Is there any "PostConstruct" feature of lombok?lombok 是否有任何“PostConstruct”功能?
【发布时间】:2021-08-20 19:27:26
【问题描述】:

有没有办法可以用 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();

【问题讨论】:

    标签: java lombok


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于@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 变量。如果类是Serializable,则设为transient

        @Getter(value = AccessLevel.NONE)
        private final transient boolean dummy;
        
      2. @AllArgsConstructor@RequiredArgsConstructor中的访问级别设为private(即使你使用staticName),这样带有dummy参数的构造函数就不能被外部访问。 p>

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        相关资源
        最近更新 更多