List list=new ArrayList 写法的意义是什么

2022-01-20 11:24:11 +08:00
 HuPu
List list=new ArrayList 相比于 ArrayList list=new ArrayList 写法的意义是什么
8951 次点击
所在节点    Java
94 条回复
dallaslu
2022-01-20 15:54:25 +08:00
酒保:
XueHua beer = new XueHua();

一个重构工程师进入了酒吧:来杯扎啤!
h82258652
2022-01-20 16:02:08 +08:00
方法输入输出面向抽象没问题,方法内部没必要,直接 var 就行了
HuPu
2022-01-20 16:03:08 +08:00
@ixx 如果已知 test(List list)了 外面的 List al = new ArrayList();或者 ArrayList al = new ArrayList();没影响啊
sampeng
2022-01-20 16:21:27 +08:00
@HuPu 才工作一年不理解正常。再过 4-5 年回来再看
ixx
2022-01-20 16:30:41 +08:00
@HuPu #63 已知是没问题 ,如果你新写一个呢,假如你写的时候没注意写了 testNew(ArrayList list); 如果外边定义使用的 ArrayList al = new ArrayList(); 是不会提示你有问题的 只有等你换 LinkedList 时才会发现要跟着改

如果外边是 List al = new ArrayList(); 定义新方法的时候就会提示你类型不对
passerbytiny
2022-01-20 16:46:16 +08:00
@HuPu #59 “光跑起来的时候能运行还不行,纯看代码也得能逻辑上说得通才行”,这是强类型语言根弱类型语言的显著区别。对于你这一场景,两句语句确实在运行上没区别。但代码逻辑上,一个传的是 List 类型变量,一个传的的 List 的子 /实现类 ArrayList 类型的变量——前者是基类,后者是子类,这个区别是很大的。建议先了解一下“编译时”跟“运行时”,这俩搞明白之后再回头来看就很容易懂了。
passerbytiny
2022-01-20 16:59:53 +08:00
@HuPu #59 我发现我们都跑题了。前面的回复你想看看,不想看可以拉到,跟你的问题没关系。

List list=new ArrayList 相比于 ArrayList list=new ArrayList 写法的意义是:纯粹从代码逻辑看的话,没意义;在编码风格上,前者比后者简洁,而越简洁的代码越好。

首先,前者比后者少几个字母。不过更重要的是,既然面向对象的多态性要求你将方法参数定义成抽象类型——你应当定义 test(List xxx),而不是 test(ArrayList xxx);那么定义传递给这个方法的变量时,同样定义为抽象类型能保持代码的简洁。
vance123
2022-01-20 17:10:49 +08:00
这只是一个面向接口的一个示例。如果面向实现编程,假设这个类在上百个地方被调用,下次你想改变实现,就得同时修改这上百个位置;更糟糕的是假如调用的地方你修改不了,像是别人的代码,这个实现就几乎没法改了
YvesX
2022-01-20 17:13:00 +08:00
什么都追求最佳实践是病
Nich0la5
2022-01-20 17:25:22 +08:00
在你不需要 arrayList 的特有方法的时候尽量使用上层接口,想象一下协作的时候 对方传给你一个 List 你就不用关心他到底是个 linkedlist 还是 arrayList ,java 就是面向抽象开发的语言,不这么写就不 java 了。
硬要传个 arrayList 行不行 当然行,但有一天你就是想传个 linkedList 了就发现出问题了。linkedList 确实用的少,所以这个场景意义没有那么大
RudyS
2022-01-20 17:26:18 +08:00
编译和实际运行是两种状态
pkoukk
2022-01-20 17:59:33 +08:00
public void sth() List{
ArrayList list=new ArrayList;
return list
}
java 是不能这么写么? c#和 golang 我都是这么写的
我觉得在变量声明的时候没有必要面对 interface,只要语言支持里式代换,在出入参处声明就行啊
Edsie
2022-01-20 18:08:29 +08:00
最烦这种,固执的纠结这种无意义的东西,明明怎么用都可以,没有什么最佳实践 用 var 不就行了 把心思用在其他地方吧
johnniang
2022-01-20 18:28:42 +08:00
如果你要是用 ArrayList 独有的方法,这样写没问题。

如果你是用的只是 List 接口里面定义的方法,建议赋值给 List 。

试想一下,未来 JDK 中实现了一种更高效的 List ,你只需要修改实现即可,不需要修改变量的类型,以及修改后可能带来的问题。
uleh
2022-01-20 18:43:26 +08:00
ArrayList al = new ArrayList() 这样写当然也能编译通过,代码执行也不会有太大问题
但是编写代码的时候,并不是代码能 run 就可以的。
首先应该是你对问题的抽象,然后使用代码逻辑来表达这个抽象。
从这个角度上来说,你的思考顺序应该是:我要使用 List 来保存数据。
然后在 Java 的语言系统里,根据需求给 List 找一个实现,比如 ArrayList 或者 LinkedList 。

所以这个并不是“可以不可以”的问题,而是本质上体现了你思考的逻辑和出发点。
ScepterZ
2022-01-20 18:58:31 +08:00
@HuPu 首先,这是一行,两处。
然后,你“只用 list 的功能”这一点,如果你写 List ,是有代码层面强制你这么做的,如果你写 ArrayList ,就只能靠自觉了
Jwyt
2022-01-20 19:12:36 +08:00
@passerbytiny
啥乱七八糟的,都是 List list = new LinkedList() 啊,怎么会直接声明 LinkedList
LinkedList 工作中几乎没用到过
imkerberos
2022-01-20 20:12:51 +08:00
等你有机会写 TestUnit 的时候就理解了.
privatetan
2022-01-20 20:38:00 +08:00
多态,在运行时动态绑定,然后选择具体实现。
kenvix
2022-01-20 21:29:32 +08:00
如果 `List list=new ArrayList` 就是个局部变量我觉得怎么写都无所谓,我一直都是 val/var 直接类型推导

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

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

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

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

© 2021 V2EX