Java 中, new 对象时,用接口作为接收变量到底有什么好处呢?

2019-08-16 14:03:46 +08:00
 Wangjl

这个问题百度了很多一直也没看明白,百度上各种文章写的也不太清晰。

有没有通俗易懂白话,来讲讲到底有什么好处

例如

接口类型 变量 = new 实现类();

实现类类型 变量 = new 实现类();
8228 次点击
所在节点    Java
80 条回复
MikeLei
2019-08-16 14:07:49 +08:00
多用于分层应用,多出一个胶水层,来隔离实现类,与业务逻辑类,业务逻辑类只需要依托于接口类.如果实现类变了,只需要跑到胶水层里面改变接口类的指向就可以了~
cheng6563
2019-08-16 14:08:34 +08:00
局部变量的话没什么区别,习惯而已。
但是方法参数或成员变量上用法就有区别了。
HuHui
2019-08-16 14:17:04 +08:00
依赖与实现分离
ipwx
2019-08-16 14:17:49 +08:00
因为 java 没有多重继承。用户需要继承自己的基类,所以你只能约定接口。
Takamine
2019-08-16 14:18:46 +08:00
面向接口编程。
love
2019-08-16 14:19:35 +08:00
java 的过度设计习惯,接口和实现分隔,哪怕你的软件只有一个实现

你用别的语言 python/php/js 写代码基本不会这么写,甚至类都很少用到
hhhsuan
2019-08-16 14:19:40 +08:00
多态
lhx2008
2019-08-16 14:21:32 +08:00
主要是面向接口编程,我这样写是说,我实现了这个接口的所有功能,但是接口外的功能,我不能做出保证,你也别调用。

面向接口编程的好处就是调用者只关心接口而非具体实现,具体实现可以更换也不受影响。

比如我要吹风机,我定义接口开,关,调节档位。只要是满足这些功能,我都照用。

现在有一个戴森吹风机,还有 XX 模式,但是,我不关心什么牌子的吹风机,我只关心他能不能开。这样我换吹风机也能适应。

至于 Service 层里面的接口设计,我个人认为是有一点形式化了,意义不大。
gz911122
2019-08-16 14:22:32 +08:00
java 的习惯性过度设计

早年中了设计模式的毒
linxl
2019-08-16 14:23:13 +08:00
多态. 实际项目中我几乎没这么用过, 一般就一个类改到底.
Wangjl
2019-08-16 14:31:15 +08:00
感觉还是好绕,没听懂呢。
JerryCha
2019-08-16 14:35:23 +08:00
大概比写成 Object instance = new XXXX()多一些约束,比 Father instance = new XXXX()多一些自由。
Wangjl
2019-08-16 14:35:30 +08:00
按照
@lhx2008
@MikeLei
两位的说法,好像是和修改实现类后,不需要修改接口什么的有关。

那么,比如
```
接口类型 变量 = new 实现类 # 这种方式如果我修改了实现了,会有什么方便的地方? 或者说有什么好处
实现类类型 变量 = new 实现类 # 这种如果修改了实现类,会有什么不方便的地方吗?
```

没理解懂。
micean
2019-08-16 14:37:39 +08:00
看实际场景
一般都没啥意义
现在都直接 var object = new Object()
chendy
2019-08-16 14:38:41 +08:00
对于 new 这个场景其实无所谓,因为已经指明了实现类,用接口接意义不大
如果是方法返回值 / 方法参数 / 成员变量,最好用接口
yule111222
2019-08-16 14:39:25 +08:00
是你接口定义得太多了,普通的单表增删改查根本不需要定义接口
yule111222
2019-08-16 14:40:45 +08:00
依赖抽象不依赖具体,是设计原则中的东西,在 JAVA 中被滥用了
anzu
2019-08-16 14:53:12 +08:00
仅就接收变量这一点来说,实现类未必是自己写的,但约定的接口大家都知道,通过接口可以约束自己的代码遵照约定而不会意外使用了实现类的额外功能。
iiiiiiiiii
2019-08-16 14:54:50 +08:00
说下自己的见解:)
[[封装]] 如果实现类 extends 或 implement 功能繁杂(就是 private 方法与其他接口实现),那么 IDE 提示简明扼要.
[[继承与多态(自己瞎想的)]] 一般我们都说去买菜,但是买什么菜得看各种情况你才能做出选择.把 new 实现类(); 抽成一个方法 getInstance(){if 来客人了 return 多买点好的(龙虾); else return 自己看想吃什么(青菜);}这种情况下显然使用接口类型要灵活的多,反正这个食物接口都是传给做菜的厨师.
在项目大的情况下,使用接口来集成各个组件间的关系比直接实现类优雅的多.你说要用实现类中独有的方法?那还是通过接口传参然后在代码块中自行 instanceof 和(Object)强转使用.
rockyou12
2019-08-16 14:57:05 +08:00
不是写框架层面的,而是局部变量没必要这样写,浪费时间。即便需要修改类型,现代 ide 也能帮你分析并替换,没必要过度使用。

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

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

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

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

© 2021 V2EX