两种表达方式有什么区别? 欢迎探讨.

x-teamer团队 2009-10-21 02:40:13
hi all:

Map map = new HashMap();



HashMap hashMap = new HashMap();


请问两者有何不同?

什么情况下用这两者?

哪一个是比较好的编程实践?

这个问题来自sun 论坛, 看看这个论坛上的兄弟,对这个问题是如何理解的。
...全文
354 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
rchming 2009-10-24
  • 打赏
  • 举报
回复
学习
bigbro001 2009-10-24
  • 打赏
  • 举报
回复
记号一个先,回去慢慢看~
jerry0814 2009-10-22
  • 打赏
  • 举报
回复
学习
x-teamer团队 2009-10-22
  • 打赏
  • 举报
回复
我是Lz,这里不是讨论设计类,也不是讨论设计函数的传参,仅仅是一个变量.

用什么方式去定义局部变量,说明我要用这个定义方式下的方法,Map和HashMap如果对我都可以用,说明这两个对我来说,都有相同函数提供给我用。

15L所说的, HashMap不可用了, 还可以用其他的类来保证,如果真的是这样极端的话,封闭原则就保证不了了, 你要修改Map a = new OtherMap.这样还不如OtherMap a = new OhterMap(), 修改一个词跟修改两个词,区别在哪里?

所以极端情况下, 上述理论是不成立的,也保证不了开闭,


显然情况不至于这么极端,HashMap显然提供的方法比Map要多,如果连HashMap都不可用了,我们凭什么认为Map能满足我们的要求, 保证开-闭原则?

我认为17L的有道理,

桌子上有一个苹果,

如果你以吃的目的去用它,那可以这样Eatable thing = new Apple();
如果你想拿它砸人, 应该这样描述: Hittable thing = new Apple();
你想全面的描述这个苹果, 则Apple thing = new Apple();

考虑到运行时类型识别要消耗的时间, 我觉得全面定义是最好的.

也就是,定义变量用HashMap map = new HashMap();

欢迎继续探讨.



默然说话 2009-10-22
  • 打赏
  • 举报
回复
怎么一边倒的说Map map=new HashMap()好呢?

我倒是不这样觉得。

我觉得各有各的好处吧。

使用父接口做变量声明带来的好处前面很多同学都谈过了,易于维护,易于扩展等等,我不再重复,这些概念能够印在各位同学的脑中,实在是一件可喜可贺的事情,也说明我们中国的IT教育是有成效的。但是,如果说“肯定”这个就是好东西,那我倒是有意见的。

我不喜欢去谈那些面向对象的基本原则,原则是正确的,但在实际应用中必然存在特殊性,例如,如果我使用Map声明了变量,带来的一个局限就是,我们只能调用到Map接口中存在的方法,而无法调用到HashMap中特有的方法了!(这种情况在具体应用中比比皆是!)

所以,世事都是相对的啦,各位,哪种方法好,还是要看实际应用,就象马克思主义到中国的应用,就象现在的有中国特色的社会主义理论,哪一件不是在基本理论思想的指导下,进行了具体变通和修改后而产生的呀?
bolink5 2009-10-21
  • 打赏
  • 举报
回复
15L 从理论和实用都讲的很清楚了
不错
其实,在团队开的发时候,会有自己的编码规范和一套标准的。
莫谈国事 2009-10-21
  • 打赏
  • 举报
回复
我感觉好像没必要啊,还是按照标准来好。
waq12 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 believefym 的回复:]
其实也要看情况的啦,
如果你就是需要用HashMap的api,而不是Map的公用API,
Map map = new HashMap()
这种写法反而没必要
[/Quote]
我也举个反例,在 android 编程中的惯例就是期望使用 HashMap map = new HashMap(); 原因是为了减少开销在嵌入式的设备上。所以说较深刻的答复是看具体情况!
waq12 2009-10-21
  • 打赏
  • 举报
回复
软件工程中的具体耦合与抽象耦合的关系
kangbaoxing 2009-10-21
  • 打赏
  • 举报
回复
bancxc 2009-10-21
  • 打赏
  • 举报
回复
面向对象的基本原则之一
针对接口编程 不正对具体编程
  • 打赏
  • 举报
回复
Map map = new HashMap();
这句好
可以实现多态
cwjieNo1 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 justinavril 的回复:]
再把5#第2点将细一点:

如果我们采用HashMap map = new HashMap()这种方式,那么map的一切属性和方法就全部依靠HashMap类的具体实现了。如果有一天,HashMap类无法满足我们的需求,我们只能重新设计另外一个类来替换HashMap类,比如AdvancedHashMap类。可以想象,这种面向具体类的编程,会被无限变化的需求折腾的永无止境。

那么我们换个思路来考虑,采用Map map = new HashMap(),这么做的前提是有一个接口Map。我们会将尽可能多的需求抽象封装到Map接口中,即使有一天HashMap不行了,我们还可以另外实现一个AdvancedHashMap类来代替这里的HashMap()类。

这样就做到了即插即用,也就从根本上满足了“开闭”原则(对于扩展开放,对于修改关闭)。最具体的例子,比如你的USB口,它有许多功能,可以连接U盘,移动硬盘,还可以连接数码相机或者手机。这些设备就是一个个的具体类,但是接口却是不变的。
[/Quote]

更了解了,感谢~
fengfengye 2009-10-21
  • 打赏
  • 举报
回复
同意。前一句好!多态
yanenyi1987 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lz12366007 的回复:]
引用 15 楼 justinavril 的回复:
再把5#第2点将细一点:

如果我们采用HashMap map = new HashMap()这种方式,那么map的一切属性和方法就全部依靠HashMap类的具体实现了。如果有一天,HashMap类无法满足我们的需求,我们只能重新设计另外一个类来替换HashMap类,比如AdvancedHashMap类。可以想象,这种面向具体类的编程,会被无限变化的需求折腾的永无止境。

那么我们换个思路来考虑,采用Map map = new HashMap(),这么做的前提是有一个接口Map。我们会将尽可能多的需求抽象封装到Map接口中,即使有一天HashMap不行了,我们还可以另外实现一个AdvancedHashMap类来代替这里的HashMap()类。

这样就做到了即插即用,也就从根本上满足了“开闭”原则(对于扩展开放,对于修改关闭)。最具体的例子,比如你的USB口,它有许多功能,可以连接U盘,移动硬盘,还可以连接数码相机或者手机。这些设备就是一个个的具体类,但是接口却是不变的。


有深层的理解了下多态。。。。
[/Quote]
很清楚。。
lz12366007 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 justinavril 的回复:]
再把5#第2点将细一点:

如果我们采用HashMap map = new HashMap()这种方式,那么map的一切属性和方法就全部依靠HashMap类的具体实现了。如果有一天,HashMap类无法满足我们的需求,我们只能重新设计另外一个类来替换HashMap类,比如AdvancedHashMap类。可以想象,这种面向具体类的编程,会被无限变化的需求折腾的永无止境。

那么我们换个思路来考虑,采用Map map = new HashMap(),这么做的前提是有一个接口Map。我们会将尽可能多的需求抽象封装到Map接口中,即使有一天HashMap不行了,我们还可以另外实现一个AdvancedHashMap类来代替这里的HashMap()类。

这样就做到了即插即用,也就从根本上满足了“开闭”原则(对于扩展开放,对于修改关闭)。最具体的例子,比如你的USB口,它有许多功能,可以连接U盘,移动硬盘,还可以连接数码相机或者手机。这些设备就是一个个的具体类,但是接口却是不变的。
[/Quote]

有深层的理解了下多态。。。。
believefym 2009-10-21
  • 打赏
  • 举报
回复
其实也要看情况的啦,
如果你就是需要用HashMap的api,而不是Map的公用API,
Map map = new HashMap()
这种写法反而没必要
zl3450341 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 justinavril 的回复:]
再把5#第2点将细一点:

如果我们采用HashMap map = new HashMap()这种方式,那么map的一切属性和方法就全部依靠HashMap类的具体实现了。如果有一天,HashMap类无法满足我们的需求,我们只能重新设计另外一个类来替换HashMap类,比如AdvancedHashMap类。可以想象,这种面向具体类的编程,会被无限变化的需求折腾的永无止境。

那么我们换个思路来考虑,采用Map map = new HashMap(),这么做的前提是有一个接口Map。我们会将尽可能多的需求抽象封装到Map接口中,即使有一天HashMap不行了,我们还可以另外实现一个AdvancedHashMap类来代替这里的HashMap()类。

这样就做到了即插即用,也就从根本上满足了“开闭”原则(对于扩展开放,对于修改关闭)。最具体的例子,比如你的USB口,它有许多功能,可以连接U盘,移动硬盘,还可以连接数码相机或者手机。这些设备就是一个个的具体类,但是接口却是不变的。
[/Quote]

很深刻 意见也很统一 第一种好

justinavril 2009-10-21
  • 打赏
  • 举报
回复
再把5#第2点将细一点:

如果我们采用HashMap map = new HashMap()这种方式,那么map的一切属性和方法就全部依靠HashMap类的具体实现了。如果有一天,HashMap类无法满足我们的需求,我们只能重新设计另外一个类来替换HashMap类,比如AdvancedHashMap类。可以想象,这种面向具体类的编程,会被无限变化的需求折腾的永无止境。

那么我们换个思路来考虑,采用Map map = new HashMap(),这么做的前提是有一个接口Map。我们会将尽可能多的需求抽象封装到Map接口中,即使有一天HashMap不行了,我们还可以另外实现一个AdvancedHashMap类来代替这里的HashMap()类。

这样就做到了即插即用,也就从根本上满足了“开闭”原则(对于扩展开放,对于修改关闭)。最具体的例子,比如你的USB口,它有许多功能,可以连接U盘,移动硬盘,还可以连接数码相机或者手机。这些设备就是一个个的具体类,但是接口却是不变的。
MORILAILIN 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 feng_jyie 的回复:]
Map map = new HashMap(); 好

易于维护,只要实现Map接口的任意类都可以替换HashMap,接口与实现分离。
[/Quote]基本上概括了
加载更多回复(13)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧