您的位置:首页 > 其它

设计思想之复合应该优于继承

2016-04-10 12:07 225 查看
import java.util.Arrays;

import java.util.Collection;

import java.util.HashSet;

@SuppressWarnings("serial")

public class HashSetAddRequest<E> extends HashSet<E>{

private int addCount=0;

public HashSetAddRequest(int index,float val){

super(index,val);

}

public HashSetAddRequest(){

}

@Override

public boolean add(E e)
{

addCount++;

return super.add(e);

};

@Override

public boolean addAll(Collection<? extends E> arg0)
{

addCount+=arg0.size();

return super.addAll(arg0);

}

public int getAddCount(){

return this.addCount;

}

public static void main(String[] args)
{

HashSetAddRequest<String> strs=new HashSetAddRequest<String>();

strs.addAll(Arrays.asList("yc","navy","hh"));

System.out.println(strs.getAddCount());

}

}

大家思考下,上面程序运行后结果会是多少呢?是不是3呢?

哈哈,是不是运行之后发现并不是你们认为的3而是6呢?那么,哪个地方出错了呢?

其实,原因出在HashSet的内部。因为addAll()方法是基于它的add()方法来实现的,即使HashSet的文档中并没有说明这一实现细节。HashSetAddRequest中的addAll()方法首先给addCount增加了3,然后利用super.addAll()来调用HashSet的addAll()的实现,然后又依次调用到HashSetAddRequest中被覆盖了的add()方法,每个元素调用一次,所以最终结果变成了6。

同学们,大家了解了吗?

参考:effective java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: