V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
HanMeiM
V2EX  ›  问与答

请问这种写法是有什么特殊的意义吗?

  •  
  •   HanMeiM · 2020-05-05 18:20:24 +08:00 · 2017 次点击
    这是一个创建于 1695 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先上代码

    // 同一个类中的两个方法如下
    // 伪代码
    public void update(int userId, User user) {
        update(userId, user.getLanguage());
    }
    
    public void update(int userId, String language) {...略}
    

    如题,是有什么特殊的含义或者作用吗?
    我比较喜欢单一职责,所以对这种方式不太理解
    PS: 没有什么其他的意思,就是单纯的想了解一下,本着求知的心态

    18 条回复    2021-05-12 13:10:00 +08:00
    randyo
        1
    randyo  
       2020-05-05 18:22:49 +08:00 via Android
    记得叫重载
    HanMeiM
        2
    HanMeiM  
    OP
       2020-05-05 18:27:17 +08:00
    @randyo 你没有理解我想问的问题
    dandycheung
        3
    dandycheung  
       2020-05-05 18:29:30 +08:00 via iPhone
    作为工具类的设计者,这样可以给使用者更多的方便。
    FutherAll
        4
    FutherAll  
       2020-05-05 18:31:55 +08:00 via iPhone
    有没有可能外面拿不到 user.language
    HanMeiM
        5
    HanMeiM  
    OP
       2020-05-05 18:32:25 +08:00
    @dandycheung 这个在逻辑层,我个人觉得没有必要保留第一个方法,在调用的时候你能更明确的知道这个方法需要什么函数,你就传什么参数,为什么要进入方法体内部让方法帮你选你需要哪个参数呢。
    randyo
        6
    randyo  
       2020-05-05 18:33:27 +08:00 via Android
    可以用来拆分功能,比如更新语言,更新邮箱,更新昵称,拆分开来可以单独使用也可以划分细节,调用更新整个 user 也可以直接调用各个功能点就行了
    HanMeiM
        7
    HanMeiM  
    OP
       2020-05-05 18:33:29 +08:00
    @FutherAll 还会有这种情况吗?不是很了解什么情况下会出现这种状况。。可以举个例子吗?
    randyo
        8
    randyo  
       2020-05-05 18:34:46 +08:00 via Android
    @HanMeiM 当你的 user 有更多需要更新的数据的时候不用改行参,用第一个就行了
    HanMeiM
        9
    HanMeiM  
    OP
       2020-05-05 18:34:49 +08:00
    @randyo 这个代码是个伪代码,实际的代码就是更新某个具体的属性,方法名也是 update + 属性名,而且第一个方法内部就是我写的那样一行。。。
    dandycheung
        10
    dandycheung  
       2020-05-05 18:38:08 +08:00 via iPhone
    @HanMeiM 对于这么细节的设计,我给出了一个可以这样设计 /编写的理由;你依然可以认为你自己的设计方案 /理念更好。如果你偏要寻找什么深层意义,那是没有必要的。具体问题具体分析,用这样的具体例子来探讨更高层次的 API 设计理念也不太适合。
    randyo
        11
    randyo  
       2020-05-05 18:41:42 +08:00 via Android
    @HanMeiM 可以继续加,各个数据可能更新代码也比较复杂,而且别人调用有 user 就传,只想更新某个数据也不用构造一个 user 传进来
    MonoLogueChi
        12
    MonoLogueChi  
       2020-05-05 18:51:25 +08:00 via Android   ❤️ 1
    重载就是方便,这个示例不够明显,如果再加上几个参数,比如 user.iduser.name,这样优势就提现出来了。

    仅仅针对上面的代码,猜想使用场景,有的时候前面获取到的变量是 user 类型,有的时候是 string 类型,都是直接拿起来就能用。更重要的是利于维护,万一某一天 user 改变了,只需要改这里一处就可以了,如果没有重载,直接传入 string 类型,就需要修改所有的 user.getlanguage
    HanMeiM
        13
    HanMeiM  
    OP
       2020-05-05 18:54:59 +08:00
    @MonoLogueChi 诶,原本代码就是这样,我只不过改了一下方法名。
    不过你这个答案让我学习了
    gen900
        14
    gen900  
       2020-05-06 01:26:47 +08:00 via iPhone
    说重载的笑死了,这叫多态。可以处理不同的输入类型。对外暴露 2 种接口,至于是否必要要结合业务需求来说了。
    0x11901
        15
    0x11901  
       2020-05-06 18:28:38 +08:00
    @gen900 哈哈哈,有内味了
    HanMeiM
        16
    HanMeiM  
    OP
       2020-05-06 18:46:25 +08:00
    @gen900 你再去看看书?
    gen900
        17
    gen900  
       2020-05-07 00:27:01 +08:00
    @HanMeiM 哪里说的不对吗?
    a1562619919
        18
    a1562619919  
       2021-05-12 13:10:00 +08:00 via Android
    java 的重载方法中的方法参数不支持动态分配,编译器无法知道运行时具体是 User 对象的哪个子类。改成调用重写方法后,就可以调用对象运行时相应的重写方法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4424 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:08 · PVG 18:08 · LAX 02:08 · JFK 05:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.