装饰一个类需特别注意的点

装饰者模式为一个类添加附加的职责提供了方法,但我们装饰一个对象通常只是实现了该interface的方法,却忘记了Objectequalshashcode的方法!!

在继承父类时,推荐建议是重写toString()方法。同样,我这里也推荐下,实现装饰者模式时,也同时复写equals和hashCode方法。

 

遇到的问题:

今天在处理Hadoop的Text的时刻遇到了一点问题,Text是Hadoop中功能类似于JDK中String的类。

 

    MapWritable result = new MapWritable();
    Map<String, Integer> resultTmp = new HashMap<String, Integer>();
    for (MapWritable hmw : results.getResults()) {
    	for(Writable writable:hmw.keySet()){
    		Text text = (Text)writable;
    		String key = new String(text.getBytes());
		Integer total = resultTmp.get(key);
    		IntWritable increment  = (IntWritable)hmw.get(writable);
    		if (total!=null){
    			resultTmp.put(key, total+increment.get());
    		}else{
    			resultTmp.put(key, increment.get());
    		}
    	}
    }
    for(String key:resultTmp.keySet()){
    	result.put(new Text(key), new IntWritable(resultTmp.get(key)));
    }
    return result;

 

上面得到的Key的String会多出一些空格。这是由于new String(text.getBytes())导致的。这里不需要转成为String,直接使用Text即可。

 

    MapWritable result = new MapWritable();
    Map<Text, Integer> resultTmp = new HashMap<Text, Integer>();
    for (MapWritable hmw : results.getResults()) {
    	for(Writable writable:hmw.keySet()){
    		Text key = (Text)writable;
		Integer total = resultTmp.get(key);
    		IntWritable increment  = (IntWritable)hmw.get(writable);
    		if (total!=null){
    			resultTmp.put(key, total+increment.get());
    		}else{
    			resultTmp.put(key, increment.get());
    		}
    	}
    }
    for(Text key:resultTmp.keySet()){
    	result.put(key, new IntWritable(resultTmp.get(key)));
    }
    return result;

 

考虑到另一个问题,equals和hashcode是否与String一样的呢!?加入到Map后?会不会导致覆盖呢?

这也是我写本文的一个重要根源所在。

--> Hadoop的源码还是OK的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值