Java 构造函数不要放业务逻辑?

2020-06-16 18:03:13 +08:00
 FireCat

翻看《阿里巴巴 Java 开发手册》有如下一条。

  1. [强制] 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。

为什么要强制执行这条,有没有现实的例子?

我自己是在单元测试遇到的坑,构造函数过于复杂没法 Mock 编写测试。还有其他的场景导致必须强制执行这个规范吗?

5276 次点击
所在节点    Java
14 条回复
wangyanrui
2020-06-16 18:27:25 +08:00
阿里巴巴开发手册 == 经验之谈 == 想遵守就遵守(不遵守有可能被喷 doge )
palmers
2020-06-16 18:42:44 +08:00
易于维护 逻辑清晰 如果硬要杠 没什么用 就是将代码块放在方法体里
InkStone
2020-06-16 18:47:38 +08:00
Explicit is better than implicit.

构造函数是隐式调用的,很容易成为盲区
wysnylc
2020-06-16 19:09:00 +08:00
不要用构造函数写业务,非框架组件开发不要动构造函数,如果需要赋值请使用链式 get/set 复杂点的可以用 build 模式
securityCoding
2020-06-16 19:28:31 +08:00
不要
forgottencoast
2020-06-16 20:30:55 +08:00
正如一楼所说,都是经验之谈,行话:最佳实践。
只要你不怕难以维护,能编译通过,运行没错误,想怎么写都可以怎么写。
billlee
2020-06-16 22:04:09 +08:00
MFC 风格的 java 代码。。
90xchun
2020-06-16 22:22:20 +08:00
构造器出了初始对象属性,不应该写相关的逻辑,主要是都不写,大家就都会 new 是相对安全的,不会出现明明只是说说想要摆摊,才和买凉糕的老板说好了而已,结果买凉糕的老板直接给一条龙服务到家,直接让你去 xx 园区 xx 路开始收钱了,就问你惊喜不惊喜
arloor
2020-06-16 22:25:49 +08:00
说一个我觉得吧

不要在构造函数内暴露 this

如果你在构造函数内写逻辑,你就可能暴露 this
Aruforce
2020-06-17 08:51:35 +08:00
鬼知道什么反射类工具会调用类的构造函数…这种情况下的调用大部分不是你想要的
ljzxloaf
2020-06-17 10:39:47 +08:00
很多库都是通过反射获取构造函数实例化类的,比如各种序列化库,而这些库经常会搞出一些漏洞,使得可以通过某些手段实例化 classpath 下的任意类,如果构造函数是个很耗时的操作,或者消耗很多资源,那就很容易通过这种方式搞垮服务。

https://devcentral.f5.com/s/articles/jackson-databind-a-story-of-blacklisting-java-deserialization-gadgets-30714
liuqi0527
2020-06-17 10:42:30 +08:00
spring 管理的实例,构造函数内依赖可能还未被注入,使用构造函数注入可能会引起循环依赖问题。
FireCat
2020-06-17 11:55:50 +08:00
我遇到的情况是,构造函数调用 private 方法对参数进行了复杂的校验,导致我没法 Mock 一个出来,写单元测试。。。。
ihbing
2023-02-24 03:49:46 +08:00
这一条只有过来人才能明白有多重要,可以避免很多坑,今天就被坑惨了,花了好几个小时去调 bug

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/682118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX