当前位置:编程学习 > JAVA >>

java为javadoc重写方法

今天看了Collection和List的源码,发现List继承Collection,然而Collection中的方法几乎都被List重写了,有些只是为了把javadoc里面的单词Collection改为List,以size()为例:


从设计者的角度看,为了能给用户更好的javadoc提示,这么做是有价值的。但从编程角度看,这样的继承有何意义?Collection还有什么存在的价值?
疑惑中,求大神点拨一下。 javadoc 方法重写 Collection List --------------------编程问答-------------------- 继承Collection的不只是List,这就是Collection存在的价值 --------------------编程问答--------------------
引用 1 楼 waynexuan 的回复:
继承Collection的不只是List,这就是Collection存在的价值

其他的也会重写啊 --------------------编程问答--------------------
引用 2 楼 feng_hen 的回复:
Quote: 引用 1 楼 waynexuan 的回复:

继承Collection的不只是List,这就是Collection存在的价值

其他的也会重写啊

继承不只是为了重用代码,更是为了多态 --------------------编程问答--------------------
引用 3 楼 waynexuan 的回复:
Quote: 引用 2 楼 feng_hen 的回复:

Quote: 引用 1 楼 waynexuan 的回复:

继承Collection的不只是List,这就是Collection存在的价值

其他的也会重写啊

继承不只是为了重用代码,更是为了多态

有道理。。。但是就是为了javadoc重写,这也太。。。第一次看到 --------------------编程问答--------------------
引用 4 楼 feng_hen 的回复:
Quote: 引用 3 楼 waynexuan 的回复:

Quote: 引用 2 楼 feng_hen 的回复:

Quote: 引用 1 楼 waynexuan 的回复:

继承Collection的不只是List,这就是Collection存在的价值

其他的也会重写啊

继承不只是为了重用代码,更是为了多态

有道理。。。但是就是为了javadoc重写,这也太。。。第一次看到
--------------------编程问答-------------------- 跟javadoc没有关系 --------------------编程问答--------------------
引用 6 楼 waynexuan 的回复:
跟javadoc没有关系

那这个重写有啥意思,都是接口。 --------------------编程问答--------------------
引用 7 楼 feng_hen 的回复:
Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。



Collection = new HashSet();
Collection = new HashMap();
Collection = new ArrayList();


public int getXXXSize(Collection a){
  return a.size();
}

--------------------编程问答-------------------- 这就是java一直宣传的oo哇哈哈哈 --------------------编程问答--------------------
引用 7 楼 feng_hen 的回复:
Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。

如果没有Collection,List、Set等接口就失去了联系,但显然它们是有很多共同点的
Collection c;
c=new HashSet();
//...
c=new ArrayList();
//... --------------------编程问答--------------------
引用 8 楼 x19881216 的回复:
Quote: 引用 7 楼 feng_hen 的回复:

Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。



Collection = new HashSet();
Collection = new HashMap();
Collection = new ArrayList();


public int getXXXSize(Collection a){
  return a.size();
}



//Collection = new HashMap();

Map是一种特殊的集合,不是Collection --------------------编程问答--------------------
引用 10 楼 waynexuan 的回复:
Quote: 引用 7 楼 feng_hen 的回复:

Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。

如果没有Collection,List、Set等接口就失去了联系,但显然它们是有很多共同点的
Collection c;
c=new HashSet();
//...
c=new ArrayList();
//...


我知道因为有了Collection,List、Set等接口有了联系,但是就算List接口里面不重写size()方法,我还是可以:
Collection c;
c=new HashSet();
//...
c=new ArrayList();
//...
然后通过 c.size()获取大小。 --------------------编程问答--------------------
引用 10 楼 waynexuan 的回复:
Quote: 引用 7 楼 feng_hen 的回复:

Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。

如果没有Collection,List、Set等接口就失去了联系,但显然它们是有很多共同点的
Collection c;
c=new HashSet();
//...
c=new ArrayList();
//...


就算List,Set接口里面没有重写size()下面的ArrayList, HashSet也会实现size()方法,但是List和Set接口里面又重新定义了一遍,覆盖了Collection里面的定义,除了javadoc我没看到其他的作用。 --------------------编程问答--------------------
引用 8 楼 x19881216 的回复:
Quote: 引用 7 楼 feng_hen 的回复:

Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。



Collection = new HashSet();
Collection = new HashMap();
Collection = new ArrayList();


public int getXXXSize(Collection a){
  return a.size();
}



a.size()方法也是下面的HashSet、ArrayList里面实现的,我问的是List接口里面为啥要重写Collection里面的size() --------------------编程问答--------------------
引用 14 楼 feng_hen 的回复:
a.size()方法也是下面的HashSet、ArrayList里面实现的,我问的是List接口里面为啥要重写Collection里面的size()

这个确实与javadoc有关 --------------------编程问答--------------------
引用 11 楼 waynexuan 的回复:
Quote: 引用 8 楼 x19881216 的回复:

Quote: 引用 7 楼 feng_hen 的回复:

Quote: 引用 6 楼 waynexuan 的回复:

跟javadoc没有关系

那这个重写有啥意思,都是接口。



Collection = new HashSet();
Collection = new HashMap();
Collection = new ArrayList();


public int getXXXSize(Collection a){
  return a.size();
}



//Collection = new HashMap();

Map是一种特殊的集合,不是Collection


这点疏忽了 --------------------编程问答--------------------
引用 15 楼 waynexuan 的回复:
Quote: 引用 14 楼 feng_hen 的回复:

a.size()方法也是下面的HashSet、ArrayList里面实现的,我问的是List接口里面为啥要重写Collection里面的size()

这个确实与javadoc有关


其实只是定义的接口行为不一样。
表示子类如果实现List接口,那就需要遵循List Javadoc的行为。
如果实现Collection那就必须要遵循Collection Javadoc的行为。
不单单只是重写一个方法而已,重写这个方法的时候应该按照Javadoc所描述的一样。这样才正确。

不过size方法在这里确实感觉没什么用处,set里的就有区别了


    /**
     * Returns the number of elements in this set (its cardinality).  If this
     * set contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
     * <tt>Integer.MAX_VALUE</tt>.
     *
     * @return the number of elements in this set (its cardinality)
     */
    int size();


你实现set接口就必须符合set的规范了,如果按照Collection的规范实现size应该是你add进去多少就返回多少,而set的行为就不一样了,返回的是去重后的大小。

虽然方法看起来不一样,但实际是重新定义了一种规范 --------------------编程问答-------------------- 更正楼上    虽然方法看起来一样,但实际是重新定义了一种规范  --------------------编程问答--------------------
引用 18 楼 x19881216 的回复:
更正楼上    虽然方法看起来一样,但实际是重新定义了一种规范 

是的,是为了javadoc的规范。
单单从编程实现的角度看,完全不考虑javadoc,这边的重写就没什么价值了。
我也是刚开始看源码,发现跟我的认知有点不一样。。。自己写完全不会这么写,对javadoc的理解还不够深。 --------------------编程问答--------------------
引用 5 楼 u011935764 的回复:
Quote: 引用 4 楼 feng_hen 的回复:

Quote: 引用 3 楼 waynexuan 的回复:

Quote: 引用 2 楼 feng_hen 的回复:

Quote: 引用 1 楼 waynexuan 的回复:

继承Collection的不只是List,这就是Collection存在的价值

其他的也会重写啊

继承不只是为了重用代码,更是为了多态

有道理。。。但是就是为了javadoc重写,这也太。。。第一次看到

啥意思 --------------------编程问答--------------------
引用 18 楼 x19881216 的回复:
更正楼上    虽然方法看起来一样,但实际是重新定义了一种规范 

也不算是javadoc的规范,是重新定义了,然后通过javadoc说明出来。 --------------------编程问答--------------------
引用 21 楼 feng_hen 的回复:
Quote: 引用 18 楼 x19881216 的回复:

更正楼上    虽然方法看起来一样,但实际是重新定义了一种规范 

也不算是javadoc的规范,是重新定义了,然后通过javadoc说明出来。


是的,这么理解就对了。 --------------------编程问答-------------------- lz看下add方法的说明,那个就比较清晰了,Collection 只保证添加进去不管你添加到哪,List不仅要保证添加进去还要保证添加到最末端。


话说没看到lz这贴,都还不知道这事儿呢 --------------------编程问答--------------------
引用 23 楼 x19881216 的回复:
lz看下add方法的说明,那个就比较清晰了,Collection 只保证添加进去不管你添加到哪,List不仅要保证添加进去还要保证添加到最末端。


话说没看到lz这贴,都还不知道这事儿呢


这已经从架构、思想方面进行考虑了,其实add方法保证添加到哪也不是因为这边重写了下就决定了的,这边只是通过javadoc告诉了你一下,没有编码上的强制性要求,具体实现还是要看下面的类是怎么实现的。 --------------------编程问答--------------------
引用 24 楼 feng_hen 的回复:
Quote: 引用 23 楼 x19881216 的回复:

lz看下add方法的说明,那个就比较清晰了,Collection 只保证添加进去不管你添加到哪,List不仅要保证添加进去还要保证添加到最末端。


话说没看到lz这贴,都还不知道这事儿呢


这已经从架构、思想方面进行考虑了,其实add方法保证添加到哪也不是因为这边重写了下就决定了的,这边只是通过javadoc告诉了你一下,没有编码上的强制性要求,具体实现还是要看下面的类是怎么实现的。


而且就算List里面不重写,下面的子类也会根据规范重写,一样可以达到相同的效果。所以说单纯从编码的角度来看,List里面的重写是多余的,从规范的角度来看,这是需要的。 --------------------编程问答-------------------- 我不同意楼主的观点。
1.楼主能否把doc文档规范摘抄出来,这样说更有理有据。如果只是自己认为的,请不要那么确定。以免误导大家。
2.楼主说接口继承重现只是为了doc文档的规范。请楼主解释一下下面的接口为何没有复写方法。
java.util Interface SortedSet<E>
All Superinterfaces:Collection<E>, Iterable<E>, Set<E> 
3.我没有找到如此编写代码确切的解释。我找到的一个好处是:当父类接口需要改动方法或删除方法是,不会影响已经生成的所有子接口和子类。
举例:
接口A中有方法1和方法2。 接口AA继承A。当N个版本以后,方法1需要在接口A中删除,子接口AA及其子类需要保留方1法。所以,在接口AA中复写接口A的方法,会让此修改特别容易,并且不会影响到子类。

写代码还是从建模的角度来设计接口和类的方法会更合理一些。一个接口和类中有些什么方法,应该考虑到他的意义,继承父类实现多态也需要考虑是否合适。对于List定义而言,size()方法就是必须的,即使他不继承collection,这里我只是假设(不要讨论合理性)。

还有一种可能性,List接口代码比Collection存在更早。所以后写Collection的时候没有重构删除List的一些方法。只是简单的把需要通用的方法都抽取到Collection中。

希望楼主能够严谨的把自己的理论用论据来证明。如果是doc规范,请摘抄出处。不然也只是一种猜测,楼主自己都说服不了自己。以上也是我的猜测。还请见多识广的人能够有力的说明一下。

--------------------编程问答--------------------
引用 26 楼 taosheng2002 的回复:
我不同意楼主的观点。
1.楼主能否把doc文档规范摘抄出来,这样说更有理有据。如果只是自己认为的,请不要那么确定。以免误导大家。
2.楼主说接口继承重现只是为了doc文档的规范。请楼主解释一下下面的接口为何没有复写方法。
java.util Interface SortedSet<E>
All Superinterfaces:Collection<E>, Iterable<E>, Set<E> 
3.我没有找到如此编写代码确切的解释。我找到的一个好处是:当父类接口需要改动方法或删除方法是,不会影响已经生成的所有子接口和子类。
举例:
接口A中有方法1和方法2。 接口AA继承A。当N个版本以后,方法1需要在接口A中删除,子接口AA及其子类需要保留方1法。所以,在接口AA中复写接口A的方法,会让此修改特别容易,并且不会影响到子类。

写代码还是从建模的角度来设计接口和类的方法会更合理一些。一个接口和类中有些什么方法,应该考虑到他的意义,继承父类实现多态也需要考虑是否合适。对于List定义而言,size()方法就是必须的,即使他不继承collection,这里我只是假设(不要讨论合理性)。

还有一种可能性,List接口代码比Collection存在更早。所以后写Collection的时候没有重构删除List的一些方法。只是简单的把需要通用的方法都抽取到Collection中。

希望楼主能够严谨的把自己的理论用论据来证明。如果是doc规范,请摘抄出处。不然也只是一种猜测,楼主自己都说服不了自己。以上也是我的猜测。还请见多识广的人能够有力的说明一下。


我要是确定就不贴出来问了



引用 21 楼 feng_hen 的回复:
Quote: 引用 18 楼 x19881216 的回复:

更正楼上    虽然方法看起来一样,但实际是重新定义了一种规范 

也不算是javadoc的规范,是重新定义了,然后通过javadoc说明出来。


我没说是javadoc的规范,就是不知道为啥要这样重写,然后根据一些回复猜测了一下。
你的也非常有道理。 --------------------编程问答--------------------
引用 26 楼 taosheng2002 的回复:
我不同意楼主的观点。
1.楼主能否把doc文档规范摘抄出来,这样说更有理有据。如果只是自己认为的,请不要那么确定。以免误导大家。
2.楼主说接口继承重现只是为了doc文档的规范。请楼主解释一下下面的接口为何没有复写方法。
java.util Interface SortedSet<E>
All Superinterfaces:Collection<E>, Iterable<E>, Set<E> 
3.我没有找到如此编写代码确切的解释。我找到的一个好处是:当父类接口需要改动方法或删除方法是,不会影响已经生成的所有子接口和子类。
举例:
接口A中有方法1和方法2。 接口AA继承A。当N个版本以后,方法1需要在接口A中删除,子接口AA及其子类需要保留方1法。所以,在接口AA中复写接口A的方法,会让此修改特别容易,并且不会影响到子类。

写代码还是从建模的角度来设计接口和类的方法会更合理一些。一个接口和类中有些什么方法,应该考虑到他的意义,继承父类实现多态也需要考虑是否合适。对于List定义而言,size()方法就是必须的,即使他不继承collection,这里我只是假设(不要讨论合理性)。

还有一种可能性,List接口代码比Collection存在更早。所以后写Collection的时候没有重构删除List的一些方法。只是简单的把需要通用的方法都抽取到Collection中。

希望楼主能够严谨的把自己的理论用论据来证明。如果是doc规范,请摘抄出处。不然也只是一种猜测,楼主自己都说服不了自己。以上也是我的猜测。还请见多识广的人能够有力的说明一下。


对于你的猜测,我有如下几点想法:

接口A中有方法1和方法2。 接口AA继承A。当N个版本以后,方法1需要在接口A中删除,子接口AA及其子类需要保留方1法。所以,在接口AA中复写接口A的方法,会让此修改特别容易,并且不会影响到子类。
方法1需要在接口A中删除的时候假如子接口没有定义,只要在子接口中定义一下该方法,对下面接口和类都不会有影响。重构步骤而已。

写代码还是从建模的角度来设计接口和类的方法会更合理一些。一个接口和类中有些什么方法,应该考虑到他的意义,继承父类实现多态也需要考虑是否合适。对于List定义而言,size()方法就是必须的,即使他不继承collection,这里我只是假设(不要讨论合理性)。
所有的继承,父类的方法对于子类来说都可以是必须的,比如说Apple接口继承Fruit接口,Fruit接口里面定义了weight()方法,对于Apple而言不管他继承不继承Fruit都要有weight()方法,但是Apple里面是不是一定要重写weight()呢。不一定吧,平时我们编码的时候也不会这么写。

还有一种可能性,List接口代码比Collection存在更早。所以后写Collection的时候没有重构删除List的一些方法。只是简单的把需要通用的方法都抽取到Collection中。
抽取的时候完全可以把子接口里面的方法删掉啊,这样不会对以前的代码有任何影响,编码的人保留了肯定有他的意图。
根据上面的一些回复,我的想法是:每个接口定义了一种规范,继承他的接口或者类都要根据他的规范来编码。比如:add()方法,Collection 只保证添加进去不管你添加到哪,List不仅要保证添加进去还要保证添加到最末端。这样规范变了,在List里面就重新定义。
我现在不解的是有的方法跟父接口没有冲突,比如List的size()方法,他的规范和父层规范是一样的,为何又重新定义。 --------------------编程问答--------------------
引用 28 楼 feng_hen 的回复:
Quote: 引用 26 楼 taosheng2002 的回复:

我不同意楼主的观点。
1.楼主能否把doc文档规范摘抄出来,这样说更有理有据。如果只是自己认为的,请不要那么确定。以免误导大家。
2.楼主说接口继承重现只是为了doc文档的规范。请楼主解释一下下面的接口为何没有复写方法。
java.util Interface SortedSet<E>
All Superinterfaces:Collection<E>, Iterable<E>, Set<E> 
3.我没有找到如此编写代码确切的解释。我找到的一个好处是:当父类接口需要改动方法或删除方法是,不会影响已经生成的所有子接口和子类。
举例:
接口A中有方法1和方法2。 接口AA继承A。当N个版本以后,方法1需要在接口A中删除,子接口AA及其子类需要保留方1法。所以,在接口AA中复写接口A的方法,会让此修改特别容易,并且不会影响到子类。

写代码还是从建模的角度来设计接口和类的方法会更合理一些。一个接口和类中有些什么方法,应该考虑到他的意义,继承父类实现多态也需要考虑是否合适。对于List定义而言,size()方法就是必须的,即使他不继承collection,这里我只是假设(不要讨论合理性)。

还有一种可能性,List接口代码比Collection存在更早。所以后写Collection的时候没有重构删除List的一些方法。只是简单的把需要通用的方法都抽取到Collection中。

希望楼主能够严谨的把自己的理论用论据来证明。如果是doc规范,请摘抄出处。不然也只是一种猜测,楼主自己都说服不了自己。以上也是我的猜测。还请见多识广的人能够有力的说明一下。


对于你的猜测,我有如下几点想法:

接口A中有方法1和方法2。 接口AA继承A。当N个版本以后,方法1需要在接口A中删除,子接口AA及其子类需要保留方1法。所以,在接口AA中复写接口A的方法,会让此修改特别容易,并且不会影响到子类。
方法1需要在接口A中删除的时候假如子接口没有定义,只要在子接口中定义一下该方法,对下面接口和类都不会有影响。重构步骤而已。

写代码还是从建模的角度来设计接口和类的方法会更合理一些。一个接口和类中有些什么方法,应该考虑到他的意义,继承父类实现多态也需要考虑是否合适。对于List定义而言,size()方法就是必须的,即使他不继承collection,这里我只是假设(不要讨论合理性)。
所有的继承,父类的方法对于子类来说都可以是必须的,比如说Apple接口继承Fruit接口,Fruit接口里面定义了weight()方法,对于Apple而言不管他继承不继承Fruit都要有weight()方法,但是Apple里面是不是一定要重写weight()呢。不一定吧,平时我们编码的时候也不会这么写。

还有一种可能性,List接口代码比Collection存在更早。所以后写Collection的时候没有重构删除List的一些方法。只是简单的把需要通用的方法都抽取到Collection中。
抽取的时候完全可以把子接口里面的方法删掉啊,这样不会对以前的代码有任何影响,编码的人保留了肯定有他的意图。
根据上面的一些回复,我的想法是:每个接口定义了一种规范,继承他的接口或者类都要根据他的规范来编码。比如:add()方法,Collection 只保证添加进去不管你添加到哪,List不仅要保证添加进去还要保证添加到最末端。这样规范变了,在List里面就重新定义。
我现在不解的是有的方法跟父接口没有冲突,比如List的size()方法,他的规范和父层规范是一样的,为何又重新定义。



size方法list和set的行为不一样的,前面我说过了,所以set里的重写有一定的意义,但list的没弄明白有什么特俗意义 --------------------编程问答--------------------
引用 29 楼 x19881216 的回复:
size方法list和set的行为不一样的,前面我说过了,所以set里的重写有一定的意义,但list的没弄明白有什么特俗意义

我就是list的没弄明白。其实是一类,就是对父接口没有特殊意义的为啥要重写。 --------------------编程问答--------------------
引用 30 楼 feng_hen 的回复:
Quote: 引用 29 楼 x19881216 的回复:

size方法list和set的行为不一样的,前面我说过了,所以set里的重写有一定的意义,但list的没弄明白有什么特俗意义

我就是list的没弄明白。其实是一类,就是对父接口没有特殊意义的为啥要重写。


这个估计得问Josh Bloch了。。不知道他写的Effective Java里有没有解释 --------------------编程问答--------------------
引用 30 楼 feng_hen 的回复:
Quote: 引用 29 楼 x19881216 的回复:

size方法list和set的行为不一样的,前面我说过了,所以set里的重写有一定的意义,但list的没弄明白有什么特俗意义

我就是list的没弄明白。其实是一类,就是对父接口没有特殊意义的为啥要重写。


估计还有就是像你说的,为了javadoc好看点。。。


貌似Josh Bloch写的代码像这种只改了注释的代码很多Queue接口的作者Doug Lea就直接偷懒没改
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,