why javaer 什么都要搞一个 interface?

2022-05-26 15:21:56 +08:00
 asanelder

最近看了几个 web 项目, 不明白的是, 为什么到处都是 interface? 而且很多 interface 只有一种实现?

俺理解的是, 只有在抽象的情况下, 以及可能有多种实现的情况下, 才需要 interface, 比如一个

IUserRepo 表示用户数据的存储, 而存储方式可能是有多种情况, 为了不在业务层耦合到具体的存储方式, 所以使用接口没问题.

但像以下这种

IUserService

UserSeriveImpl

对于这种业务层为什么还要抽象一种接口? 俺好像没见过 IUserService 这种接口有多种实现的情况?

8263 次点击
所在节点    程序员
89 条回复
ThinkCat
2022-05-26 17:09:11 +08:00
如果不涉及到多实现,那可以不用 interface ,直接写 class 实现就行了。但是如果明确在后期存在扩展的情况,一定要定为接口,避免后期大范围的修改代码
potatowish
2022-05-26 17:14:21 +08:00
有规范就容易产生模板式的代码,但是没有规范,大家各写各的,不利于团队开发
forbreak
2022-05-26 17:16:42 +08:00
大部分情况下没用,但是一旦要用,你之前写了跟没写 差距久出来了。 我只一个旧项目,改 rpc 调用,之前写了 inteface 很容易久迁移好了。没写的话,就得重新写一遍。。
FreshOldMan
2022-05-26 17:21:13 +08:00
不容易出错
FreshOldMan
2022-05-26 17:21:33 +08:00
相当于注释了吧
panpanpan
2022-05-26 17:23:15 +08:00
虽然 Spring 在 AOP 的时候,类实现了接口就使用 JDK 动态代理,没有则使用 CGLib
但是实际上大家都用 springboot, springboot2.0 之后默认情况下不管你有没有接口统统用 CGLib
yazinnnn
2022-05-26 17:30:54 +08:00
写 spring 不会写,都是单实现,基本不会写接口

写 vertx 时会, 因为会用到 service proxy 和 codegen

基于 future 的接口 client, 会把 reactive 的 client 给你包好
基于 future 的接口服务, 会把 eventbus proxy 生成好


现在改用 quarkus,然后又不写接口了....
lixiaohui0812
2022-05-26 17:34:36 +08:00
test + 多个实现
v2orz
2022-05-26 17:38:28 +08:00
因为我真的见到过有多种实现的情况
mekingname
2022-05-26 17:41:49 +08:00
写 java 的人,骨子里就喜欢过度设计。他们很多人写的代码一辈子都不会重构或者增加新的功能了,但是他们总是抱着:未来要增加新的功能,所以要面向接口来设计。
sparky
2022-05-26 17:48:54 +08:00
面向接口而非实现的编程思想
越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性、扩展性、可维护性
dajj
2022-05-26 18:00:27 +08:00
无脑重复前人的代码, 毒瘤模板而已
yangyaofei
2022-05-26 18:25:18 +08:00
很多原因吧, 比如: 1. 被诟病的 封装, 设计设计设计, 设计模式啊, blbla... 2. 正常原因 java 不能多继承,只能用 interface 来做(其实还好) 3. 卷 4. 包屎
asanelder
2022-05-26 18:56:50 +08:00
@statumer #19 嗯, 这样说也有点道理, 关键是好多接口和实现是一个人来写的...

@mgcnrx11 #22 不明白需求增长了, 为啥要替换实现?
@chendy #34 俺也是这么个意思
@darksword21 #36 持久层可以抽象的, 俺的意思是业务层为啥也要抽象...
@Kaiv2 #38 这个确实也是一种场景. 俺忽略了
@yazinnnn #47 看来这写不写接口不是设计上的考虑, 有时更多是框架的限制...
fpure
2022-05-26 19:32:20 +08:00
@dcalsky mock 也可以不用接口的
cool4food
2022-05-26 19:34:28 +08:00
对 OO SOLID 稍微理解深入一点的话,应该就不会有那种尬黑吐槽的言论了
RadishWind
2022-05-26 19:41:30 +08:00
之前接手过一个屎山就没有 interface+impl 结果有个方法很慢 找到后没法使用 @Cache 注解进行优化 Spring 很多特性是依赖动态代理的
icylogic
2022-05-26 19:42:40 +08:00
超出必须的设计,无非就是方便调试 /测试 /扩展,如果未来一段时间内,你发现你实现新需求 /调试 /测试的时候,需要从这里继承实现一个不一样的,那说明这设计至少算不上错,如果你发现你这项目到死都没有过这种事,那就是过度设计,要么是思维上懒惰,要么是对未来需求预估错误。如果你发现你可能需要,但你觉得有更好的方式,那就是你们团队之间选择谁来适应谁的问题。
haah
2022-05-26 19:46:25 +08:00
为啥 C/C++er 要写头文件呢?
CoderGeek
2022-05-26 20:05:34 +08:00
看下 jdbc mycat 的源码 - -

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

https://ex.noerr.eu.org/t/855458

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

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

© 2021 V2EX