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

2022-01-20 11:24:11 +08:00
 HuPu
List list=new ArrayList 相比于 ArrayList list=new ArrayList 写法的意义是什么
8951 次点击
所在节点    Java
94 条回复
kenvix
2022-01-20 21:30:13 +08:00
当然如果是入参、出参那就意义重大了——为了多态
hingbong
2022-01-20 21:39:49 +08:00
声明变量没什么意义,在方法上用接口做参数比较有意义
Narcissu5
2022-01-20 23:21:32 +08:00
首先回楼主,工作一年真的只能叫新手。。。

其次,虽然写 Java 的很多,但是很多人其实并不真的理解 OO ,更不懂得使用设计模式。虽然写 Java 但是一大堆静态方法,我想这也是 Go 这种更加偏向面向过程的语言能够在中国特别流行的原因之一。
EscYezi
2022-01-20 23:39:05 +08:00
习惯这么写,感觉清爽一点
Map<K,V> m = new HashMap<>()
20150517
2022-01-21 00:01:42 +08:00
果然这种简单问题能吸引流量
ShotaconXD
2022-01-21 09:20:00 +08:00
....封装 继承 多态 都忘光啦
chocotan
2022-01-21 10:00:49 +08:00
qiany
2022-01-21 11:34:06 +08:00
这种要配合设计模式用 工作三年应该才能有所体会
wanguorui123
2022-01-21 11:37:13 +08:00
var a=[]
byte10
2022-01-21 12:07:36 +08:00
@HuPu 🤣 笑死我了。别说一年,整个 3-5 年,你去面试那些家伙,有几个能回答上面向对象编程的哈。还有那个抽象类都说不明白的。一年不理解很正常,少年,你应该看看我的视频,看完你就知道你的差距是多少了。地址: https://www.bilibili.com/video/BV1FS4y1o7QB#reply99287502976
@vance123 你理解的不到位。楼主是说定义变量,而不是定义接口 变量。

我来讲一个核心的问题吧,ArrayList list=new ArrayList<>() ,没有问题,但是你要是写 MyArrayList list=new MyArrayList<>() 。这个就有问题,因为我不认识 MyArrayList ,我只认识 ArrayList 或者 List 。我甚至不认识 linkedList 。你要我去翻 API 文档吗?

所以你以后把 ArrayList list=new ArrayList<>();改成 MyArrayList list=new MyArrayList<>() 是不行的,只能是 yList list=new MyArrayList<>() 。那还不如一开始就是 List list 的变量。楼主你明白了吗,这个回答应该是可以完美解开你的疑惑了吧。
darkengine
2022-01-21 13:01:18 +08:00
其实函数内的局部变量活着类的私有成员变量你随便用,如果是 public 的成员变量或者 publich 方法的参数或返回值的类型,你就得仔细考虑了。
jameslan
2022-01-21 13:18:52 +08:00
就是教条。从语言设计者到使用者。Java 里面类似的蠢东西一抓一大把。

面向接口编程本身是很好的,但是你得搞清为什么:其目的是为了封装时的解耦合。也就是说,参数类型为接口时,调用者有最大的自由,选择传入什么对象。当外部需要改变时,无需改动封装好的代码( open - close 原则)。

但是其实还有另外一个问题 - 过度优化:完全没有多态需求的地方,比如一个非常 local 的 class ,也非要弄一个接口,说是以防将来变化。其实接口根本不稳定,每次都要改接口定义,还额外加了很多行代码。

说回这个局部变量。一个 scope 只在 method 内部的对象,create 之后,要立刻“忘掉”对象的类,只“记得”接口,这真没太大意义,毕竟一个 method 也没多大(理论上)。而且因为其局部性,对多态完全无影响。对大家熟知的类和接口,像 List 和 ArrayList 也就罢了,其他类和对象也这么搞,实在是脱裤子放屁。

至于说修改的时候方便一些,的确是的。但是 1.都怪这狗屎语法(我记得 Java7 加 diamond operator 的时候有过讨论,但是就是决定弄成现在这个样子,而不是抄 C#加一个 var 。目的是让程序员肉眼检查类型,这 design taste 也是没谁了。现在加上 var 了,啪啪啪,脸疼不?) 2.不用 IDE 的吗? 3.修改这玩意的概率有多大?所以 1.善用 var ,2. List ArrayList 的不用想的,这样写也就罢了,别的真没必要。

PS: List ArrayList, LinkedList 完全就是 Library 设计的问题了。List 接口给了 random access ,结果一个类 O(1), 一个类 O(n),你这让人怎么面向接口编程。。。。
aguesuka
2022-01-21 15:38:54 +08:00
(暴论) 99% 的场景里, new ArrayList 都可以用 List.of, new ArrayDeque, Stream.toList 代替; 非得在集合里保存 null, 或一定要用 Mutable 集合且一定要 RandomAccess 时, 应该使用 var list = new ArrayList.

实际作为 LocalVariable 使用时, List 和 ArrayList 的唯一区别就是在 IDEA 里想调用 list.equals 可以放心大胆的 e+TAB 而不用担心补全的是 list.ensureCapacity.
hanqy228
2022-04-02 14:58:39 +08:00
@HuPu 看你写的地方了 很多人都说了 如果是私有的作用域那你随意写 ok 。但是如果是公共部分且调用繁多的话还是前者好。不然短时间内可能没事问题。一旦调用越来越多的话,需求一旦有变动。这个技术债会很高很可怕的。牵一发而动全身。

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

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

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

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

© 2021 V2EX