翻看《阿里巴巴 Java 开发手册》有如下一条。
为什么要强制执行这条,有没有现实的例子?
我自己是在单元测试遇到的坑,构造函数过于复杂没法 Mock 编写测试。还有其他的场景导致必须强制执行这个规范吗?
1
wangyanrui 2020-06-16 18:27:25 +08:00
阿里巴巴开发手册 == 经验之谈 == 想遵守就遵守(不遵守有可能被喷 doge )
|
2
palmers 2020-06-16 18:42:44 +08:00
易于维护 逻辑清晰 如果硬要杠 没什么用 就是将代码块放在方法体里
|
3
InkStone 2020-06-16 18:47:38 +08:00 2
Explicit is better than implicit.
构造函数是隐式调用的,很容易成为盲区 |
4
wysnylc 2020-06-16 19:09:00 +08:00
不要用构造函数写业务,非框架组件开发不要动构造函数,如果需要赋值请使用链式 get/set 复杂点的可以用 build 模式
|
5
securityCoding 2020-06-16 19:28:31 +08:00
不要
|
6
forgottencoast 2020-06-16 20:30:55 +08:00
正如一楼所说,都是经验之谈,行话:最佳实践。
只要你不怕难以维护,能编译通过,运行没错误,想怎么写都可以怎么写。 |
7
billlee 2020-06-16 22:04:09 +08:00
MFC 风格的 java 代码。。
|
8
90xchun 2020-06-16 22:22:20 +08:00 via iPhone
构造器出了初始对象属性,不应该写相关的逻辑,主要是都不写,大家就都会 new 是相对安全的,不会出现明明只是说说想要摆摊,才和买凉糕的老板说好了而已,结果买凉糕的老板直接给一条龙服务到家,直接让你去 xx 园区 xx 路开始收钱了,就问你惊喜不惊喜
|
9
arloor 2020-06-16 22:25:49 +08:00 1
说一个我觉得吧
不要在构造函数内暴露 this 如果你在构造函数内写逻辑,你就可能暴露 this |
10
Aruforce 2020-06-17 08:51:35 +08:00 via Android
鬼知道什么反射类工具会调用类的构造函数…这种情况下的调用大部分不是你想要的
|
11
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 |
12
liuqi0527 2020-06-17 10:42:30 +08:00
spring 管理的实例,构造函数内依赖可能还未被注入,使用构造函数注入可能会引起循环依赖问题。
|
13
FireCat OP 我遇到的情况是,构造函数调用 private 方法对参数进行了复杂的校验,导致我没法 Mock 一个出来,写单元测试。。。。
|
14
ihbing 2023-02-24 03:49:46 +08:00
这一条只有过来人才能明白有多重要,可以避免很多坑,今天就被坑惨了,花了好几个小时去调 bug
|