【问题标题】:Is there a way to execute a method during construction but after the constructor?有没有办法在构造期间但在构造函数之后执行方法?
【发布时间】:2018-04-21 13:51:14
【问题描述】:

我正在使用 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)都没有任何用处

【问题讨论】:

  • 你试过使用@PostConstruct吗?
  • 你正在使用 lombok 怎么样使用projectlombok.org/features/GetterLazy
  • @azurefrog 好主意,除了该类不是托管 bean;它只是一个 POJO。
  • @RC。我不能使用生命周期,因为它不是 bean。我已经编辑了问题以明确说明
  • @RC。我收回了-我以为您在谈论javax ...懒惰。发表您的评论作为答案,您将获得奖励!

标签: java constructor initialization lombok


【解决方案1】:

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

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

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

【讨论】:

  • 代码也可以内联private final int sqrt = (int) Math.sqrt(x);,从而避免compute()方法的存在
  • 如果您在调用 getter 之前访问变量,您将拥有一个 null,这对于 final 原语 pastebin.com/5D0tCgaS 来说似乎很奇怪
  • @RC。我冒昧地把你的回答记下来了。我还测试了代码以确保它确实有效(我同意,这非常酷!)。 Andrew 是(不出所料)正确的:只有通过 getter 访问才能调用魔法。
  • 没问题,是的,这假设您只能通过 getter 访问sqrt(但它仍然是一个非常酷的功能)
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2016-11-13
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多