`
小玩子
  • 浏览: 22678 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

浅谈一下java API设法的一个错误带来的后果引以为戒

阅读更多
java从出台以来有十二年的历史了,我们从未知到现在被广大程序员所接受 正是说明了它有其存在与发展的空间
但是人无完人 java在设计上也有自身的缺点,举个例子:从API里可以看到java.util.Stack类,stack 的特点是后进先出 且不能查找 array的特点是易于查找但是增删比较难
这个一般的程序员都很清楚 这个类是java.util.Vector的子类,Vector底层实现是用array且线程安全,这就与statck本身的特点不符合,再者由于是继承,stack就会将父类的所有方法都继承过来
如:add(int index,E element)这与stack是根本就不能实现的 但是SUN公司对于这个错误是没办法挽回了 以至于这个错误就一直错了十多年 最后SUN公司给出的解释就是不要轻易用这个类
从这件小事上来说明 一个设计者小小的失误对代码或者一个应用会起到为意想不到的结果 所以我们要努力再努力去完善自己

分享到:
评论
40 楼 mj20030608 2007-08-10  
看的太爽了
39 楼 lihengxin 2007-08-02  
学习中....
38 楼 roger51 2007-07-30  
这样的问题还有什么价值讨论,不知道有什么意思,
37 楼 galaxystar 2007-07-28  
FIFO , FILO, 其实用一个List都能搞定, 默认List就是FIFO的.
add(0, Element) 就是FILO了
36 楼 mathgl 2007-07-27  
C++也可以 用 copy handle这种技巧来达到
避免复制对象的开销 和java一个道理

用smart_ptr也可
35 楼 geszJava 2007-07-27  
netpcc 写道
我觉得这是thinking in java的一家之言。
Stack和Vector都是线性表。Vector的所有操作也没有超出线性表的范畴,全暴露出来也没有什么错。
至少也可以认为是从实用的角度考虑。遍历栈是常见的操作。要求修改某个元素,甚至删除某个元素的算法也很多。虽然可以通过弹栈后再压栈来模拟,毕竟是非效率的。

我开发C++多年,比较喜欢C++的哲学,即实用性。对于概念上的完备性不是那么的看重。
我觉得JAVA中要求Main函数也必定要放在某个类中就比较牵强。属于为了一切都是类而硬凑。

说实话,我觉得stl的stack比较鸡肋。连迭代器都没有提供。我是基本不用的。


我倒觉得JAVA中要求Main函数也必定要放在某个类是很合理的设计.不仅概念清晰,而且也很实用.不像c那样只有一个main函数.
34 楼 netpcc 2007-07-26  
我觉得这是thinking in java的一家之言。
Stack和Vector都是线性表。Vector的所有操作也没有超出线性表的范畴,全暴露出来也没有什么错。
至少也可以认为是从实用的角度考虑。遍历栈是常见的操作。要求修改某个元素,甚至删除某个元素的算法也很多。虽然可以通过弹栈后再压栈来模拟,毕竟是非效率的。

我开发C++多年,比较喜欢C++的哲学,即实用性。对于概念上的完备性不是那么的看重。
我觉得JAVA中要求Main函数也必定要放在某个类中就比较牵强。属于为了一切都是类而硬凑。

说实话,我觉得stl的stack比较鸡肋。连迭代器都没有提供。我是基本不用的。
33 楼 JAVA_ED 2007-07-25  
netpcc 写道
JAVA_ED 写道
netpcc 写道
1.C++ stl 里stack的实现类是可以通过第二个模板参数选择的。并非一定是deque。
2.C++的数据结构通常保存Value,而不是Reference。这样的话(a)Copy的成本比较高,(b)vector要求连续内存,所以对于size比较大的Value,以及大数据量不适合。而java只能是Reference,所以Copy的成本并不高。
3.我想说明的是做为stack的底层结构,vector比linkedlist好,不是和deque做比较。通常deque比vector更适合。但有些情况vector更好。但是我找不出来在什么情况下linkedlist比较好。
4.我的前提条件是对stack的push和pop的操作次数远大于stack的最大元素数量的情况。也就是不停的push和pop。这是stack的典型情况。
5.能不能具体说说把vector的methods暴露出来有什么缺点。

对于CPP的情况 你可以GOOGLE一下
JAVA的vector暴露了本不应该属于其具有的API


C++ STL的source我非常熟,如果你觉得我说的有问题,请具体说明那里不对。你这么笼统说让我GOOGLE一下,我都不知道去搜什么。

至于哪些API应该属于STACK,哪些可有可无,哪些绝不可以有似乎没有什么标准吧。
对于Stack来说,除了Push/Pop必不可少之外,别的有那么严格吗?

没说你说的不对啊
就是GOOGLE这个帖子的内容
Refer thinking in java

Stack is inherited from Vector. So it has all of the characteristics and behaviors of a Vector plus some extra Stack behaviors. It’s difficult to know whether the designers consciously thought that this was an especially useful way of doing things, or whether it was just a naïve design; in any event it was clearly not reviewed before it was rushed into distribution, so this bad design is still hanging around (but you should never use it).

至于CPP 前面已经贴了STL的code
namespace std
{
  // Forward declarations of operators == and <, needed for friend
  // declaration.
  template<typename _Tp, typename _Sequence = deque<_Tp> >
    class stack;
    ...

REFER:
The deque manages memory more efficiently than a vector.

默认的实现即是Deque 当然可以写自己的容器类adapter
数据结构学过线性栈和链栈 而且你也说了Deque是适合于大部分情况
前面我也是这样说的
32 楼 netpcc 2007-07-25  
sunsy 写道
那大家是否介绍几种比较好的stack实现。


没有在任何情况下都最优的实现。
只能根据样本的情况来选择最优实现。
大部分情况下deque是个好选择.


当然了肯定有人会说,现在机器都这么快,内存那么多了,谁还在乎这点差别呀。
31 楼 netpcc 2007-07-25  
JAVA_ED 写道
netpcc 写道
1.C++ stl 里stack的实现类是可以通过第二个模板参数选择的。并非一定是deque。
2.C++的数据结构通常保存Value,而不是Reference。这样的话(a)Copy的成本比较高,(b)vector要求连续内存,所以对于size比较大的Value,以及大数据量不适合。而java只能是Reference,所以Copy的成本并不高。
3.我想说明的是做为stack的底层结构,vector比linkedlist好,不是和deque做比较。通常deque比vector更适合。但有些情况vector更好。但是我找不出来在什么情况下linkedlist比较好。
4.我的前提条件是对stack的push和pop的操作次数远大于stack的最大元素数量的情况。也就是不停的push和pop。这是stack的典型情况。
5.能不能具体说说把vector的methods暴露出来有什么缺点。

对于CPP的情况 你可以GOOGLE一下
JAVA的vector暴露了本不应该属于其具有的API


C++ STL的source我非常熟,如果你觉得我说的有问题,请具体说明那里不对。你这么笼统说让我GOOGLE一下,我都不知道去搜什么。

至于哪些API应该属于STACK,哪些可有可无,哪些绝不可以有似乎没有什么标准吧。
对于Stack来说,除了Push/Pop必不可少之外,别的有那么严格吗?
30 楼 小玩子 2007-07-25  
有 但是没有提供源代码的而且大部分是.net做的
java的根本没有 我今天在上面搜了快一下午了
29 楼 sunsy 2007-07-25  
没做过OA的系统,GOOGLE一下应该有些类似的学习源码吧。
28 楼 小玩子 2007-07-25  
楼上的偶现在有个困难 能不能帮偶找一个JAVA版的OA源代码啊
27 楼 sunsy 2007-07-25  
小玩子 写道
sunsy 写道
是是是,我是直接用stack了,vector的方法不用就是了。就没有再自己实现栈了。


对不起哦 可能是俺的话激怒你了吧 不好意思  请你喝茶


没有没有,哪能呢,讨论问题而已嘛。
26 楼 小玩子 2007-07-25  
sunsy 写道
是是是,我是直接用stack了,vector的方法不用就是了。就没有再自己实现栈了。


对不起哦 可能是俺的话激怒你了吧 不好意思  请你喝茶
25 楼 sunsy 2007-07-25  
是是是,我是直接用stack了,vector的方法不用就是了。就没有再自己实现栈了。
24 楼 小玩子 2007-07-25  
就算你反对就vector 也可以试着去用linkedlist
23 楼 小玩子 2007-07-25  
vector能用的方法就用呗
不符合stack的就不要体现出来
这只是取其精华而已
再说了代码最大的好不处不就是可以重用吗
22 楼 sunsy 2007-07-25  
都对vector有比较多的看法,那有无更好的实现方式呢?把继承改成属性,只是在使用上接口定义更清晰,不触及vector的实现,但在stack的实现上似乎并没有什么实质改变。
21 楼 小玩子 2007-07-25  
把vector变成他的属性 不要去继承就好啦

相关推荐

Global site tag (gtag.js) - Google Analytics