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);
}这样不是更简单,也更高效吗?

解决方案 »

  1.   

    在任何地方,我能够调用public E push(E item)的前提,就是我已经有了item这个引用,你的说法好像不太对吧
    或者我没理解清楚?能给个示例代码给我看看吗?
      

  2.   

    s.push(str);
    就可以了,不用处理返回值
      

  3.   

    这个设计我想可能是出于其对Stack实现的自我理解和风格的展现
    Stack中自身定义的5个方法都是有返回值的 统一的同时也有为人性化作考虑
    假如str参数是直接取自某一复杂表达式 设计成有返回值就可以省一步多余的赋值操作了看起源码解释
    This has exactly
         * the same effect as:
         * <blockquote><pre>
         * addElement(item)</pre></blockquote>
    很能说明是在实现了功能之上的设计层包装
      

  4.   

    恩,明白你的意思,不过难道仅仅是为了省去一个赋值操作?
    可是大部分情况下,100次里有99次都不需要得到return值的,1次是需要赋值的,况且,赋值的表达式如果很复杂,那也是很少的情况下才会出现
    也就是说,大约10000次里,只有1次需要return值,而多执行了9999次return语句,这不是很伤性能吗?
      

  5.   

    基本没什么用处.
    再说把Stack建立在Vector的基础上也不是好的设计选择.
      

  6.   

    对,继承Vector是相当大的败笔
      

  7.   

    别跟我说大道理,现在就是讨论这个push方法,既然性能不是这个方法的第一优先准则,
    那你说说这个方法里,什么才是第一优先准则。
      

  8.   

    java.util.Stack这个包导进什么,具体含义有哪位高手知道啊?