`

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

 
阅读更多

装饰者模式为一个类添加附加的职责提供了方法,但我们装饰一个对象通常只是实现了该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的。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics