【发布时间】: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