创建对象 lombok 生成器与手动声明的更快方法
faster way to create object lombok builder vs manually declaration
这 3 种创建对象的方式,哪种方式执行速度更快?
Amount.builder().categoryCode("A").coveredAmount(new
BigDecimal(100)).build();
或
Amount cva1 = new Amount();
cva1.setCoveredAmount(new BigDecimal(100));
cva1.setCategoryCode("A");
或
Amount cva1 = new Amount(new Bigdecimal(100), "A");
而且字段数可以不同吗?
让我们评估每个语法有多少堆栈帧(只是一个粗略的图表,请原谅我的简洁):
1) builder() ->returns -> categoryCode() -> return this -> coveredAmount() -> return this
-> new BigDecimal() -> return BigDecimal -> return this -> finally build() -> returns Amount
所以总共调用了 6 个函数。
2) ctr call -> return Amount -> setter -> bigdecimal -> return bigdecimal -> return setter -> (same again as last step)
总共调用了 5 次
For 3) only 2 function calls
通过以上分析,第 3 种语法获胜,但您的编译器可能会以所有三种语法都具有相似执行时间的方式进行优化。
除了性能比较(花生顺便说一句......)你不应该使用基于他的执行时间的对象创建策略,而应该仅仅根据你的实际需要,要求和最佳实践。
Fluent Builder pattern
- 更好的可读性
- 可选属性
- 分步施工
Remark
:不要使用此模式来隐藏您的 class 定义了太多字段的事实......使用像 extract class
这样的模式而不是通过构建器构造.
Javabean style
。这种类型的构造(IMO)是一种不好的做法,因为从无参数构造到调用 setter 对其进行初始化之间的时间,对象仍然处于不一致状态。
Primary constructor
。当所有字段都是 required
.
时,您更喜欢这种方式
这 3 种创建对象的方式,哪种方式执行速度更快?
Amount.builder().categoryCode("A").coveredAmount(new
BigDecimal(100)).build();
或
Amount cva1 = new Amount();
cva1.setCoveredAmount(new BigDecimal(100));
cva1.setCategoryCode("A");
或
Amount cva1 = new Amount(new Bigdecimal(100), "A");
而且字段数可以不同吗?
让我们评估每个语法有多少堆栈帧(只是一个粗略的图表,请原谅我的简洁):
1) builder() ->returns -> categoryCode() -> return this -> coveredAmount() -> return this
-> new BigDecimal() -> return BigDecimal -> return this -> finally build() -> returns Amount
所以总共调用了 6 个函数。
2) ctr call -> return Amount -> setter -> bigdecimal -> return bigdecimal -> return setter -> (same again as last step)
总共调用了 5 次
For 3) only 2 function calls
通过以上分析,第 3 种语法获胜,但您的编译器可能会以所有三种语法都具有相似执行时间的方式进行优化。
除了性能比较(花生顺便说一句......)你不应该使用基于他的执行时间的对象创建策略,而应该仅仅根据你的实际需要,要求和最佳实践。
Fluent Builder pattern
- 更好的可读性
- 可选属性
- 分步施工
Remark
:不要使用此模式来隐藏您的 class 定义了太多字段的事实......使用像 extract class
这样的模式而不是通过构建器构造.
Javabean style
。这种类型的构造(IMO)是一种不好的做法,因为从无参数构造到调用 setter 对其进行初始化之间的时间,对象仍然处于不一致状态。Primary constructor
。当所有字段都是required
. 时,您更喜欢这种方式