关于java.util.Stack的一点点疑问

boxiuzhen 2008-10-23 09:38:39
java.util.Stack源代码中有这么一个方法:

/**
* Pushes an item onto the top of this stack. This has exactly
* the same effect as:
* <blockquote><pre>
* addElement(item)</pre></blockquote>
*
* @param item the item to be pushed onto this stack.
* @return the <code>item</code> argument.
* @see java.util.Vector#addElement
*/
public E push(E item) {
addElement(item);

return item;
}


虽然短短四行,却让我很疑惑,
为什么方法的参数里有item,返回的仍然是item呢?
也就是说,既然我已经有了引用a,我为什么还要去调用push方法再获得一遍这个引用a呢,不是多此一举吗?
就好比下面的这段多此一举的代码:

Stack s = new Stack();
String str = "a";
String str2 = s.push(str);
System.out.println(str2);


我想问问java的设计者为什么不设计成如下的形式?

public void push(E item) {
addElement(item);
}


这样不是更简单,也更高效吗?
...全文
173 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuhui01 2010-05-19
  • 打赏
  • 举报
回复
java.util.Stack这个包导进什么,具体含义有哪位高手知道啊?
boxiuzhen 2008-10-25
  • 打赏
  • 举报
回复
是啊,我也感觉一点关系也没有
boxiuzhen 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ZangXT 的回复:]
基本没什么用处.
再说把Stack建立在Vector的基础上也不是好的设计选择.
[/Quote]
对,继承Vector是相当大的败笔
ZangXT 2008-10-24
  • 打赏
  • 举报
回复
基本没什么用处.
再说把Stack建立在Vector的基础上也不是好的设计选择.
boxiuzhen 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dracularking 的回复:]
这个设计我想可能是出于其对Stack实现的自我理解和风格的展现
Stack中自身定义的5个方法都是有返回值的 统一的同时也有为人性化作考虑
假如str参数是直接取自某一复杂表达式 设计成有返回值就可以省一步多余的赋值操作了

看起源码解释
This has exactly
* the same effect as:
* <blockquote> <pre>
* addElement(item) </pre> </blockquote>
很能说明是在实现了功能之上的设计层包装
[/Quote]
恩,明白你的意思,不过难道仅仅是为了省去一个赋值操作?
可是大部分情况下,100次里有99次都不需要得到return值的,1次是需要赋值的,况且,赋值的表达式如果很复杂,那也是很少的情况下才会出现
也就是说,大约10000次里,只有1次需要return值,而多执行了9999次return语句,这不是很伤性能吗?
YL_Show 2008-10-24
  • 打赏
  • 举报
回复
Mark
dracularking 2008-10-24
  • 打赏
  • 举报
回复
这个设计我想可能是出于其对Stack实现的自我理解和风格的展现
Stack中自身定义的5个方法都是有返回值的 统一的同时也有为人性化作考虑
假如str参数是直接取自某一复杂表达式 设计成有返回值就可以省一步多余的赋值操作了

看起源码解释
This has exactly
* the same effect as:
* <blockquote><pre>
* addElement(item)</pre></blockquote>
很能说明是在实现了功能之上的设计层包装
boxiuzhen 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ZangXT 的回复:]
s.push(str);
就可以了,不用处理返回值
[/Quote]
这个我知道,我问的是为什么这个方法要设计成有返回值的
ZangXT 2008-10-24
  • 打赏
  • 举报
回复
s.push(str);
就可以了,不用处理返回值
boxiuzhen 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java__king 的回复:]
当你需要在别的地方引用这个方法,又刚好需要他返回一个对象时就会看到这样的好处了.
[/Quote]
在任何地方,我能够调用public E push(E item)的前提,就是我已经有了item这个引用,你的说法好像不太对吧
或者我没理解清楚?能给个示例代码给我看看吗?
ZangXT 2008-10-24
  • 打赏
  • 举报
回复
没有关系。
boxiuzhen 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 FL1429 的回复:]
那工厂模式为什么一定要把对象实例化放在一个方法里?


差不多一个道理吧~!
[/Quote]
不懂,有什么关系?
FL1429 2008-10-24
  • 打赏
  • 举报
回复
那工厂模式为什么一定要把对象实例化放在一个方法里?




差不多一个道理吧~!
boxiuzhen 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dracularking 的回复:]
引用 7 楼 boxiuzhen 的回复:
引用 5 楼 dracularking 的回复:
这个设计我想可能是出于其对Stack实现的自我理解和风格的展现
Stack中自身定义的5个方法都是有返回值的 统一的同时也有为人性化作考虑
假如str参数是直接取自某一复杂表达式 设计成有返回值就可以省一步多余的赋值操作了

看起源码解释
This has exactly
* the same effect as:
* <blockquote> <pre>
* addElement(item) </pre> </bl…
[/Quote]
别跟我说大道理,现在就是讨论这个push方法,既然性能不是这个方法的第一优先准则,
那你说说这个方法里,什么才是第一优先准则。
dracularking 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 boxiuzhen 的回复:]
引用 5 楼 dracularking 的回复:
这个设计我想可能是出于其对Stack实现的自我理解和风格的展现
Stack中自身定义的5个方法都是有返回值的 统一的同时也有为人性化作考虑
假如str参数是直接取自某一复杂表达式 设计成有返回值就可以省一步多余的赋值操作了

看起源码解释
This has exactly
* the same effect as:
* <blockquote> <pre>
* addElement(item) </pre> </blockquote>
很能说明是在实现了…
[/Quote]
带返回值就很伤性能?
再说性能就非得是第一优先设计准则?哪怕只有一丝一毫
而根本不顾其它任何准则?
java__king 2008-10-23
  • 打赏
  • 举报
回复
当你需要在别的地方引用这个方法,又刚好需要他返回一个对象时就会看到这样的好处了.

62,614

社区成员

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

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