`
小玩子
  • 浏览: 23060 次
  • 性别: 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变成他的属性 不要去继承就好啦

相关推荐

    《java程序调试》的一些方法

    程序错误类型按照发现难度的不同可以分为三类:编译错误、运行时错误和逻辑错误(这里描述为“没有错误的错误”)。这三类错误在调试过程中都需要采取不同的策略来处理。 1. **编译错误**:这类错误是最容易发现的...

    基于Java的异常处理技术与应用.pdf

    Java将程序中的错误分为两类:一类是程序本身的代码存在问题,导致程序不能简单地恢复执行,这就是错误;另一类是不可以预测的异常情况,通过某种修正后程序还可以继续执行,这类错误称为异常(如内存不足、找不到所...

    浅谈微分方程模型在经济学中的应用.doc

    浅谈微分方程模型在经济学中的应用 微分方程模型在经济学中的应用是经济学研究的重要工具之一。经济问题的处理和决策的产生都离不开数学经济模型的应用。数学经济模型可以按变量的性质分成两类,即概率型和确定型。...

    JAVA 五子棋人机对战

    【JAVA五子棋人机对战】是一种基于JAVA编程实现的智力游戏,它结合了基本的计算机算法与玩家之间的互动,让玩家可以与计算机进行五子棋比赛。在这个项目中,开发者采用了一些简单的人工智能策略,通过分析棋盘上不同...

    通信与网络中的浅谈梭子鱼安全负载均衡机

     梭子鱼安全负载均衡机是一个强大的TCP/UDP 4-7层流量管理设备,功能强大、易用且适用于所有规模的企业。除了强大的负载均衡功能之外,梭子鱼安全负载均衡机还内置入侵检测(IPS)系统。即使有人已经设法突破了你...

    浅谈新理念下幼儿园美术活动的开展.docx

    【标题】:浅谈新理念下幼儿园美术活动的开展 【描述】:本文探讨了在新的教育理念下,如何有效地开展幼儿园美术活动,以促进幼儿的全面发展。 【标签】:幼儿美术教学,观察分析法,范例教学法,启发联想法,情境...

    达内 coreJava 习题答案

    12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main...

    Java程序员面试宝典:数字的智力测试

    Java程序员在面试中经常面临各种智力测试,这些测试旨在评估候选人的逻辑思维、问题解决能力和数学技巧。以下是一些解答智力测试的关键策略: 1. **排除法**:这是最基本也是最常用的策略,通过排除明显不相关或不...

    JAVA性能瓶颈和漏洞检测

    JProbe Suite是一种能节省开发时间、降低开发费用、改善Java应用运行速度及和扩展能力的强大工具套件,在全球各地拥有大量用户。通过JProbe Suite,开发和测试小组可以全面诊断应用性能、内存使用、线程及代码覆盖等...

    教育精品资料浅谈信息技术在培养小学数学创新思维能力的有效运用.doc

    【教育精品资料浅谈信息技术在培养小学数学创新思维能力的有效运用】 信息技术的快速发展为教育领域带来了革命性的变化,尤其在小学数学教学中,它已成为激发学生创新思维的重要工具。本文探讨了如何通过信息技术的...

    浅谈思想政治教育.docx

    面对这一挑战,教师需要转变教育理念,注重情感投入,建立与学生的深厚联系。 【关爱学生,理解其需求】 教师对学生的关爱是教育成功的关键。通过深入理解学生的想法,关注他们的心理变化,可以及时发现并解决问题...

    如果应用系统是面向多种语言的,编程时就不得不设法解决国际化问题

    如果应用系统是面向多种语言的,编程时就不得不设法解决国际化问题,包括操作界面的风格问题、提示和帮助语言的版本问题、界面定制个性化问题等。由于Java语言具有平台无关、可移植性好等优点,并且提供了强大的类库...

    如果应用系统是面向多种语言的,编程时就不得不设法解决国际化问题、

    如果应用系统是面向多种语言的,编程时就不得不设法解决国际化问题,包括操作界面的风格问题、提示和帮助语言的版本问题、界面定制个性化问题等。由于Java语言具有平台无关、可移植性好等优点,并且提供了强大的类库...

    浅谈提高小学数学课堂效率的途径.docx

    教师应设法打破这种定势,通过“一题多问”、“一题多解”和“一题多变”等方法,激发学生的创新思维。例如,对于同一道题,教师可以从不同角度提问,鼓励学生寻找多种解法。在解题过程中,学生应该学会从不同角度...

    三年级奥数用假设法解题PPT教案.pptx

    三年级奥数用假设法解题PPT教案.pptx

    浅谈小学数学教材中“数学广角”.doc

    【数学广角】是人教版小学数学教材中设置的一个特色单元,旨在向小学生逐步渗透数学思维方法。这个单元的设计不仅是教材的亮点,也是教育创新的体现,它针对学生的数学思维训练,旨在培养学生的数学兴趣、欣赏数学美...

    Java专业课程设计点小游戏.docx

    本课程设计的目标是通过设计和实现一个 21 点小游戏,来加深学生对面向对象程序设计理论、方法和基础知识的了解,掌握使用 Java 语言进行面向对象设计的基础方法,提升利用面向对象知识分析实际问题、处理实际问题...

    浅谈思想品德课堂中教学活动设计的情感运用

    1. **假设法**:通过设定情境,让学生扮演特定角色,使学生产生信任感。例如,让学生扮演人大代表,参与解决问题,这样既能让学生感受到知识的实际应用,也能激发他们的积极参与,提高学习信心。 2. **设疑法**:...

    Java建构主义教学实践.pdf

    根据建构主义学习理论,Java程序语言的教学设计应该包括以下几个方面: (一)以学生为中心,配套各种资源支持学生自由探索和自主学习。为学生提供各种工具和信息资源,包括文字材料、书籍、音像资料、CAI与多媒体...

    四年级下册数学人教版重难点突破卷2巧用“假设法”解题(含答案).pdf

    通过假设其中一个未知数为一个特定的数值,利用问题中给出的条件来求解另一个未知数,再结合实际情况对假设的数值进行调整,最终得出正确的答案。例如,在“四年级下册数学人教版重难点突破卷2”中,题目涉及用假...

Global site tag (gtag.js) - Google Analytics