V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
FireCat
V2EX  ›  Java

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

  •  1
     
  •   FireCat · 2020-06-16 18:03:13 +08:00 · 5250 次点击
    这是一个创建于 1623 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    不要在构造函数内暴露 this

    如果你在构造函数内写逻辑,你就可能暴露 this
    Aruforce
        10
    Aruforce  
       2020-06-17 08:51:35 +08:00 via Android
    鬼知道什么反射类工具会调用类的构造函数…这种情况下的调用大部分不是你想要的
    ljzxloaf
        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
    liuqi0527
        12
    liuqi0527  
       2020-06-17 10:42:30 +08:00
    spring 管理的实例,构造函数内依赖可能还未被注入,使用构造函数注入可能会引起循环依赖问题。
    FireCat
        13
    FireCat  
    OP
       2020-06-17 11:55:50 +08:00
    我遇到的情况是,构造函数调用 private 方法对参数进行了复杂的校验,导致我没法 Mock 一个出来,写单元测试。。。。
    ihbing
        14
    ihbing  
       2023-02-24 03:49:46 +08:00
    这一条只有过来人才能明白有多重要,可以避免很多坑,今天就被坑惨了,花了好几个小时去调 bug
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5926 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:57 · PVG 09:57 · LAX 17:57 · JFK 20:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.