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

2020-05-05 18:20:24 +08:00
 HanMeiM

先上代码

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

public void update(int userId, String language) {...略}

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

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

仅仅针对上面的代码,猜想使用场景,有的时候前面获取到的变量是 user 类型,有的时候是 string 类型,都是直接拿起来就能用。更重要的是利于维护,万一某一天 user 改变了,只需要改这里一处就可以了,如果没有重载,直接传入 string 类型,就需要修改所有的 user.getlanguage
HanMeiM
2020-05-05 18:54:59 +08:00
@MonoLogueChi 诶,原本代码就是这样,我只不过改了一下方法名。
不过你这个答案让我学习了
gen900
2020-05-06 01:26:47 +08:00
说重载的笑死了,这叫多态。可以处理不同的输入类型。对外暴露 2 种接口,至于是否必要要结合业务需求来说了。
0x11901
2020-05-06 18:28:38 +08:00
@gen900 哈哈哈,有内味了
HanMeiM
2020-05-06 18:46:25 +08:00
@gen900 你再去看看书?
gen900
2020-05-07 00:27:01 +08:00
@HanMeiM 哪里说的不对吗?
a1562619919
2021-05-12 13:10:00 +08:00
java 的重载方法中的方法参数不支持动态分配,编译器无法知道运行时具体是 User 对象的哪个子类。改成调用重写方法后,就可以调用对象运行时相应的重写方法。

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

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

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

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

© 2021 V2EX